初学golang,尝试写一个程序,但是在mysql操作时遇到了问题~ 看网上文章,推荐mysql直接创建一个db全局变量,然后连接一次,以后使用到直接用这个db,我按照这样的方法,然后进行操作,可是程序却一直崩溃,代码如下:
var db *sql.DB
func put(str string) bool {
// 执行到这里就崩溃
rows, err := db.Query("SELECT `id` FROM `user` WHERE `username`='"+str+"';")
if err != nil{
panic(err)
}
defer rows
}
func main(){
var err error
db, err = sql.Open("mysql", "root:123456@tcp(127.0.0.1:3306)/dht?charset=utf8")
if err != nil {
panic(err)
}
defer db.Close()
// 获取信息代码
for{
go func(str string) {
ok := put(str)
if !ok {
fmt.Println("error")
}
}(str)
time.Sleep(10 * time.Second)
}
}
不知道是什么原因,一执行到查询,或者其他操作语句,程序就会崩溃,然后报错:panic: runtime error: invalid memory address or nil pointer dereference
有疑问加站长微信联系(非本文作者)

具体报错的代码是哪一行?
rows, err := db.Query("SELECT
id
FROMuser
WHEREusername
='"+str+"';") 这一行从错误看,是 db == nil,你在这个语句前打印 db 看看是否为 nil;另外,你确定 put 这个函数是在 sql.Open 之后调用?因为给出的代码不全,所以问一句
恩,的确是db==nil 但很奇怪啊,put函数的确是在sql.Open之后调用的,而且,我一开始是直接把sql.Open写到Init中的,但依然不行
考虑从 sql.Open 之后,跟踪 db 的值试试?
哦,好的,我试试
你这里db.Close()不应该关闭。 你在调取完就关闭了。所以db为Nil
main里面关闭了连接,所以在协程里面的连接是空引用。但是如果希望协程中可以使用此连接,需要channel来发送信号。在进行close。