我的代碼如下:package mainimport ( "database/sql" "fmt" _ "github.com/mattn/go-sqlite3" "log")var db *sql.DBfunc 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}我遇到了這個問題,但這種方法對我不起作用。我正在使用 sqlite3 進行存儲。我的目標很簡單。在所有函數(shù)之間共享 db 處理程序。構建和運行時出現(xiàn)以下錯誤。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 +0x7aedatabase/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 +0x43database/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 +0xa6main.getNames(0x0, 0x0, 0x0) /Users/kdys/Code/go/src/test/main.go:32 +0x94main.main() /Users/kdys/Code/go/src/test/main.go:21 +0x188goroutine 5 [chan receive]:database/sql.(*DB).connectionOpener(0xc20802e000) /usr/local/Cellar/go/1.4.2/libexec/src/database/sql/sql.go:589 +0x4ccreated by database/sql.Open /usr/local/Cellar/go/1.4.2/libexec/src/database/sql/sql.go:452 +0x31cgoroutine 17 [syscall, locked to thread]:runtime.goexit() /usr/local/Cellar/go/1.4.2/libexec/src/runtime/asm_amd64.s:2232 +0x1我在這里做錯了什么?
1 回答

慕仙森
TA貢獻1827條經(jīng)驗 獲得超8個贊
你creatng局部db內(nèi)變量main。當您調用 時getNames,它正在使用 global db,它仍然為零。
用
var err error
db, err = sql.Open("sqlite3", "./data.db")
- 1 回答
- 0 關注
- 239 瀏覽
添加回答
舉報
0/150
提交
取消