2015-03-30 225 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