My code is the following:
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
}
I came across this question but the approach don't work for me. I'm using sqlite3 for storage. My goal is simple. Share the db handler across all the functions. I'm getting the following error when build and run.
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
What i'm doing wrong here ?