登录
登录 注册新账号
注册
已有账号登录

需求

使用QueryRow 查询数据库中的记录数。

代码

func CountConnected(uid string) (int, error) {
    var num int
    err := db.QueryRow("SELECT COUNT(1) FROM tb_connect WHERE user_id=? AND status=1 ", uid).Scan(&num)
    if err != nil {
        if err == sql.ErrNoRows {
            num = 0
        } else {
            log.Println("CountConnected", err.Error())
        }
    }

    return num, err
}

报错

panic: runtime error: invalid memory address or nil pointer dereference
[signal 0xc0000005 code=0x0 addr=0x0 pc=0x737d01]

goroutine 1 [running]:
database/sql.(*DB).conn(0x0, 0x9dbd00, 0xc0000680e8, 0x3d6c01, 0x203000000000000, 0x3effff, 0xc00)
        c:/go/src/database/sql/sql.go:1080 +0x41
database/sql.(*DB).query(0x0, 0x9dbd00, 0xc0000680e8, 0x95703e, 0x43, 0xc000091c78, 0x2, 0x2, 0xc000052e01, 0x10, ...)
        c:/go/src/database/sql/sql.go:1513 +0x6d
database/sql.(*DB).QueryContext(0x0, 0x9dbd00, 0xc0000680e8, 0x95703e, 0x43, 0xc000091c78, 0x2, 0x2, 0xc000091c00, 0x4097f2, ...)
        c:/go/src/database/sql/sql.go:1495 +0xd8
database/sql.(*DB).QueryRowContext(...)
        c:/go/src/database/sql/sql.go:1596
database/sql.(*DB).QueryRow(0x0, 0x95703e, 0x43, 0xc000091c78, 0x2, 0x2, 0x417646)
        c:/go/src/database/sql/sql.go:1607 +0x94
_/d_/test/src/device.CountConnected(0x940304, 0x7, 0x20, 0x9c548e, 0x8)
        d:/test/src/device/query.go:21 +0x10a
main.main()
        d:/test/src/main.go:57 +0x52
exit status 2
1 个回答

db的初始化代码在哪里?猜测应该没有初始化。一般在包的init函数中初始化:

var db *sql.DB
func init() {
    db, err := sql.Open("mysql",
        "user:password@tcp(127.0.0.1:3306)/test")
    if err != nil {
        panic(err)
    }
}
撰写答案