执行数据库初始化之后,查询时出现 runtime error: invalid memory address or nil pointer dereference
package main
import (
"fmt"
"database/sql"
_ "github.com/go-sql-driver/mysql"
"log"
)
var SqlDB *sql.DB
func init(){
DBInit()
}
func main(){
var err error
rs, err := SqlDB.Exec("select * from user")
if err != nil{
fmt.Println("Query data error: ", err)
}
fmt.Println("User: ", rs)
}
// DBInit Mysql connecter
func DBInit(){
SqlDB, err := sql.Open("mysql", fmt.Sprintf("%s:%s@tcp(%s:%d)/%s", DB.User, DB.Passwd, DB.Host, DB.Port, DB.Database))
if err != nil{
log.Fatal(err)
}
SqlDB.SetMaxIdleConns(120)
SqlDB.SetMaxOpenConns(120)
if err = SqlDB.Ping(); err != nil{
log.Fatal(err)
}
}
需要了解原因,我们需要了解一个操作符
:= 该操作符是赋值操作,会为其前面的变量赋值,如果前面的变量未定义, 则会根据其后的返回结果,定义该变量并赋值
代码中**:=** 是根据sql.Open(…) 的返回结果, 创建了两个变量 SqlDB, err 而不是使用预定义的变量 SqlDB, 导致main函数中使用的SqlDB未示例话
var SqlDB *sql.DB
...
SqlDB, err := sql.Open("mysql", fmt.Sprintf("%s:%s@tcp(%s:%d)/%s", DB.User, DB.Passwd, DB.Host, DB.Port, DB.Database))
预定义 err, 然后将 := 改为 =
package main
import (
"fmt"
"database/sql"
_ "github.com/go-sql-driver/mysql"
"log"
)
var SqlDB *sql.DB
func init(){
DBInit()
}
func main(){
var err error
rs, err := SqlDB.Exec("select * from user")
if err != nil{
fmt.Println("Query data error: ", err)
}
fmt.Println("User: ", rs)
}
// DBInit Mysql connecter
func DBInit(){
var err error
SqlDB, err = sql.Open("mysql", fmt.Sprintf("%s:%s@tcp(%s:%d)/%s", DB.User, DB.Passwd, DB.Host, DB.Port, DB.Database))
if err != nil{
log.Fatal(err)
}
SqlDB.SetMaxIdleConns(120)
SqlDB.SetMaxOpenConns(120)
if err = SqlDB.Ping(); err != nil{
log.Fatal(err)
}
}