当前位置: 首页 > 工具软件 > gosql > 使用案例 >

Go sql invalid memory address or nil pointer dereference

张晨朗
2023-12-01

Go sql invalid memory address or nil pointer dereference

1、概述

执行数据库初始化之后,查询时出现 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)
	}

}

2、解决方法

原因

需要了解原因,我们需要了解一个操作符
:= 该操作符是赋值操作,会为其前面的变量赋值,如果前面的变量未定义, 则会根据其后的返回结果,定义该变量并赋值

代码中**:=** 是根据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)
	}
}

 类似资料:

相关阅读

相关文章

相关问答