[英]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.