我的代码如下:
package main
import (
"database/sql"
"fmt"
_ "github.com/mattn/go-sqlite3"
"log"
)
var db *sql.DB
func main() {
fmt.Println("Starting test ...")
db, err := sql.Open("sqlite3", "./data.db")
checkErr(err)
err = db.Ping()
checkErr(err)
fmt.Println(getNames())
}
func checkErr(err error) {
if err != nil {
log.Fatal(err)
}
}
func getNames() []string {
query := `select name from places`
rows, err := db.Query(query)
checkErr(err)
defer rows.Close()
var names []string
for rows.Next() {
var name string
rows.Scan(&name)
names = append(names, name)
}
return names
}
我遇到了 this question但这种方法对我不起作用。我正在使用 sqlite3 进行存储。 我的目标很简单。在所有函数之间共享数据库处理程序。 构建和运行时出现以下错误。
Starting test ...
panic: runtime error: invalid memory address or nil pointer dereference
[signal 0xb code=0x1 addr=0x0 pc=0x411fc6e]
goroutine 1 [running]:
database/sql.(*DB).conn(0x0, 0x0, 0x0, 0x0)
/usr/local/Cellar/go/1.4.2/libexec/src/database/sql/sql.go:634 +0x7ae
database/sql.(*DB).query(0x0, 0x421cb10, 0x17, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0)
/usr/local/Cellar/go/1.4.2/libexec/src/database/sql/sql.go:933 +0x43
database/sql.(*DB).Query(0x0, 0x421cb10, 0x17, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0)
/usr/local/Cellar/go/1.4.2/libexec/src/database/sql/sql.go:924 +0xa6
main.getNames(0x0, 0x0, 0x0)
/Users/kdys/Code/go/src/test/main.go:32 +0x94
main.main()
/Users/kdys/Code/go/src/test/main.go:21 +0x188
goroutine 5 [chan receive]:
database/sql.(*DB).connectionOpener(0xc20802e000)
/usr/local/Cellar/go/1.4.2/libexec/src/database/sql/sql.go:589 +0x4c
created by database/sql.Open
/usr/local/Cellar/go/1.4.2/libexec/src/database/sql/sql.go:452 +0x31c
goroutine 17 [syscall, locked to thread]:
runtime.goexit()
/usr/local/Cellar/go/1.4.2/libexec/src/runtime/asm_amd64.s:2232 +0x1
我做错了什么?
最佳答案
您正在 main
中创建一个本地 db
变量。当您调用 getNames
时,它使用的是全局 db
,它仍然是 nil。
使用
var err error
db, err = sql.Open("sqlite3", "./data.db")
关于go - 共享数据库全局处理程序时遇到问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29354470/