Go语言:=赋值的坑

问题描述

测试进行go连接数据库操作,却发现爆出下列无效指针错误

连接代码

1
2
3
4
5
6
7
8
9
10
11
...
var Db *sql.DB
func init() {
Db, err := sql.Open("mysql", "root:123456@tcp(localhost:3306)/test?charset=utf8")
if err != nil {
fmt.Println(err)
}
Db.Ping()
}

问题解决

这是不同作用域:=赋值的坑
如果是作用域内没有变量,使用:=会重新定义该作用域内的局部变量

举例

1
2
3
4
5
6
7
8
9
10
11
12
var Db *sql.DB
func init() {
fmt.Printf("赋值前 %p\n", &Db)
Db, err := sql.Open("mysql", "root:123456@tcp(localhost:3306)/test?charset=utf8")
fmt.Printf("赋值后 %p\n", &Db)
if err != nil {
fmt.Println(err)
}
Db.Ping()
}

赋值前 0x15b6368
赋值后 0xc42000e038

这意味着声明了一个局部变量Db并赋值,与此同时全局变量Db依旧是没有值

正确的做法是

1
2
3
4
5
6
7
8
9
10
11
12
13
14
var Db *sql.DB
func init() {
var err error
fmt.Printf("赋值前 %p\n", &Db)
Db, err = sql.Open("mysql", "root:123456@tcp(localhost:3306)/test?charset=utf8")
fmt.Printf("赋值后 %p", &Db)
if err != nil {
fmt.Println(err)
}
Db.Ping()
}

赋值前 0x15b6368
赋值后 0x15b6368