【发布时间】:2017-02-16 22:22:20
【问题描述】:
我对 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() 中时,查询有效 - 我假设这是因为函数具有“本地”范围(这是正确的术语吗?),我需要将 db 对象定义为我在主要功能。
如果是这种情况 - 我如何运行 q() 函数而不重复自己建立数据库连接?这是“指针”进来的地方吗?另外,我仍然不确定 & 符号在这里做什么:
err := rows.Scan(&id, &name)
谢谢
【问题讨论】:
-
将
db作为参数传递给q()怎么样?那会起作用的。 -
这也不适用于 python 范围规则,您在
main中定义了db,但试图在q中引用它。 -
你的假设和术语是完全正确的,同样的事情在 python 中也行不通。
-
我认为你需要先安装插件来检查你的代码错误。那里有很棒的编辑器和插件。