繁体   English   中英

Golang,指针,函数

[英]Golang, Pointers, Functions

我是Golang和一般的静态类型编译程序的新手。 我以前的所有经验都是关于Python的。

这种范式转换既令人沮丧(程序很少编译),又使我受益匪浅,因为我终于开始了解许多以前对我而言陌生的概念(垃圾收集,指针,作用域)。

有人可以在概念上向我解释为什么该程序无法编译以及修复该语法的语法吗? 我只是想查询数据库并打印结果:

package main

import (
    "database/sql"
    "log"

    _ "github.com/denisenkom/go-mssqldb"
)

func main() {

    db, err := sql.Open("sqlserver", "odbc:server=myServer;user id=myName;password=myPassword;")
    if err != nil {
        log.Fatal(err)
    }
    defer db.Close()

    q()
}

func q() {

    var (
        id   int
        name string
    )

    rows, err := db.Query("SELECT id, name FROM myTable")
    if err != nil {
        log.Fatal(err)
    }
    defer rows.Close()

    for rows.Next() {
        err := rows.Scan(&id, &name)

        if err != nil {
            log.Fatal(err)
        }
        log.Println(id, name)
    }
    err = rows.Err()
    if err != nil {
        log.Fatal(err)
    }

}

我得到的错误是:

undefined: db in db.Query

当我将逻辑放在主要函数的q()中时,查询有效-我假设这是因为函数具有“局部”作用域(这是正确的术语吗?),并且需要像在主要功能。

如果是这种情况,如何在不建立数据库连接的情况下重复运行q()函数? 这是“指针”进入的地方吗? 另外,我仍然不确定“&”号在这里做什么:

 err := rows.Scan(&id, &name)

谢谢

db var是在main func作用域定义的,因此您的q func不会“看到”它。 您必须将其作为指针传递给q方法。 像这样:

func q(db *sql.DB) {
   ...
}

main db var已经是一个指向sql.DB结构的指针,因此您只需要在main func中执行q(db)调用就可以了。

就像其他人提到的那样,问题在于在函数main声明了变量db ,而您正尝试在q函数中访问该变量。 您有两种选择来解决此问题:

1)将变量db声明为主要函数之外的全局变量,如下所示:

就像其他人提到的那样,问题在于在函数main声明了变量db ,而您正尝试在q函数中访问该变量。 您有两种选择来解决此问题:

1)将变量db声明为主要函数之外的全局变量,如下所示:

package main

import (
"database/sql"
"log"
_ "github.com/denisenkom/go-mssqldb"
)

var db *sql.DB

func main() {

db, err = sql.Open("sqlserver", "odbc:server=myServer;user id=myName;password=myPassword;")
.
.
.
.

需要注意的重要一点是用于将值分配给全局变量的赋值( =而不是:= )运算符。 因为如果您使用简短的变量声明:=那么它将创建一个本地db变量。

2)您可以像这样将db指针作为参数传递给函数q

package main

import (
    "database/sql"
    "log"
    _ "github.com/denisenkom/go-mssqldb"
)
func main() {

    db, err := sql.Open("sqlserver", "odbc:server=myServer;user id=myName;password=myPassword;")
    if err != nil {
      log.Fatal(err)
    }
    defer db.Close()

    q(db)
}

func q(db *sql.DB) {

    var (
        id   int
        name string
    )
.
.
.
.

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM