报错 :panic: runtime error: invalid memory address or nil pointer dereference

package main

import (
    "database/sql"
    "encoding/json"
    "fmt"
    "io/ioutil"

    _ "github.com/go-sql-driver/mysql"
)

var xxx = map[string]string{}

func readFile(filename string) (map[string]string, error) {
    bytes, err := ioutil.ReadFile(filename)
    if err != nil {
        fmt.Println("ReadFile:", err.Error())
        return nil, err
    }
    if err := json.Unmarshal(bytes, &xxx); err != nil {
        fmt.Println("unmarsha1:", err.Error())
        return nil, err
    }
    return xxx, nil
}

func main() {
    xxxmap, err := readFile("json.ini")
    if err != nil {
        fmt.Println("readfile", err.Error())
    }
    fmt.Println(xxxmap["address"])

    db, err := sql.Open("mysql", "root:123456@tcp(192.168.59.128:3390)/likej?charset=utf8")
    if err != nil {
        //        panic("connect err")
        fmt.Println(err.Error())
    }
    rows, err := db.Query("select * from rt")
    columns, err := rows.Columns()
    values := make([]sql.RawBytes, len(columns))
    scanargs := make([]interface{}, len(values))

    for i := range values {

        scanargs[i] = &values[i]
    }
    for rows.Next() {
        err = rows.Scan(scanargs...)
        if err != nil {
            panic(err.Error())
        }
        var value string
        for i, col := range values {
            if col == nil {
                value = "NULL"
            } else {
                value = string(col)
            }
            fmt.Println(columns[i], ": ", value)
        }
        fmt.Println("------------------")
    }
    if err = rows.Err(); err != nil {
        panic(err.Error())
    }
}

共 8 个回复


jiangyd

这个代码在Ubuntu 编译的,执行报错
但是编译好的文件放到其他的linux系统,执行可以成功,同样的代码在windows也是执行成功的

# 0

stevewang

35行if err != nil分支里需要返回。

# 1

hao1118

具体哪里出错,可查看堆栈:

if err != nil {
        //        panic("connect err")
        fmt.Println(err.Error())
        fmt.Println(debug.Stack())
        return
    }
# 2

jiangyd

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

goroutine 1 [running]:
database/sql.(*Rows).Columns(0x0, 0x0, 0x0, 0x0, 0x0, 0x0)
    c:/go/src/database/sql/sql.go:1660 +0x35
main.main()
    d:/mygo/src/sql/sql.go:43 +0x5ef

goroutine 5 [chan receive]:
database/sql.(*DB).connectionOpener(0x11722600)
    c:/go/src/database/sql/sql.go:634 +0x3c
created by database/sql.Open
    c:/go/src/database/sql/sql.go:481 +0x276
# 3

jiangyd

加上了debug.stack(),但是报的错我看不懂

# 4

stevewang

rows, err := db.Query("select * from rt")执行出错了,你没有检查err值,就直接使用实际上是空值的rows,所以panic了。
你这程序问题太多,那么多error都不检查的。

# 6

hao1118

39,40行的err要检查

# 7