go - 共享数据库全局处理程序时遇到问题

标签 go

我的代码如下:

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/

相关文章:

multithreading - golang 应用程序运行时保留了很多线程

testing - 如何为基于 net/http 的代码编写集成测试?

concurrency - 如何打印并发和递归函数的结果?

go - Go 中的类型和减法

mysql - 如何使用 sqlx 进行 LEFT JOIN 查询?

go - 如何合并2个结构

go - 使用 Cgo 时为 "unexpected R_X86_64_64 relocation for dynamic symbol"

go - 检查 SSL 自签名证书的有效性

debugging - Go语言中常见的陷阱有哪些?

go - 如何在 Hyperledger Fabric 中解码交易负载