2015-03-30 206 views
-1

我的代碼如下:故障共享DB全球處理器

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 

我在做什麼錯在這裏?

+1

你被告知之前(在上一個問題(一個明確的評論[?](http://stackoverflow.com/questions/29351734/negroni-mux-flow-refactor-the- sqlite3-database-connection))你問幾分鐘/小時之前你刪除了!)你的問題是什麼。不要因爲忽視評論,刪除問題以及重新提出同樣的事情而浪費人們的時間。 – 2015-03-30 19:46:21

回答

1

您在main內創建了一個當地db變量。當您撥打getNames時,它使用全球db,該值仍然爲零。

使用

var err error 
db, err = sql.Open("sqlite3", "./data.db") 
+0

哦,我明白了,愚蠢的錯誤。謝謝。 – 2015-03-30 19:37:40