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



gorm内存问题报错

问题背景

在db.go文件中声明了全局变量,并在InitDB函数中初始化db

var db *gorm.DB

func InitDB() {
// mysql
DbHost := ""
DbPort :=
DbUser := ""
DbPassword := ""
DbName := ""
DbCharset := ""

dsn := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=%s&parseTime=True&loc=Local",
DbUser,
DbPassword,
DbHost,
DbPort,
DbName,
DbCharset)

db, err = gorm.Open(mysql.New(mysql.Config{DSN: dsn}), &gorm.Config{})
if err!=nil{
panic("failed to connect to database, err:"+err.Error())
}

该过程没有报错,但是在后续数据库查询时出现内存错误,runtime error: invalid memory address or nil pointer dereference

初步判断是db指针出错

错误原因

虽然声明了全局变量db,但是在InitDB函数中,由于使用推导等号​​:=​​,InitDB函数中实际上生成了一个局部变量db

因此全局变量db并没有被赋值

解决方法

解决方法很多,其中一个方法是声明一个全局变量err,然后在InitDB函数中使用​​=​​创建db,这样就不会产生局部变量db,而是直接使用全局变量db