go的初始化方式有很多种,在某些情况下容易引起重复初始化导致错误。
事例如下:
当使用gorm连接数据库时定义了全局DB
Go
var DB *gorm.DB
但是在后面某个函数内部初始化时导致DB重新初始化变成了局部变量,导致原来的全局变量DB还是nil
Go
func Init() {
dsn := fmt.Sprintf("root:@tcp(127.0.0.1:3306)/test?charset=utf8mb4&parseTime=True&loc=Local")
DB, _ = gorm.Open(mysql.Open(dsn), &gorm.Config{})
if DB.Error != nil {
fmt.Println("连接失败")
} else {
fmt.Println("连接成功")
}
}
以至于在后面的调用中报错如下:
Go
func (User *UserController) Find(c *gin.Context) {
userlist := []models.User{}
result := models.DB.Find(&userlist)
if result.Error != nil {
c.JSON(http.StatusOK, gin.H{
"code": 1,
"msg": "查询失败",
"data": nil,
})
} else {
c.JSON(http.StatusOK, gin.H{
"code": 0,
"msg": "查询成功",
"data": userlist,
})
}
}
Go
runtime error: invalid memory address or nil pointer dereference
所以要警惕两种初始化方法重复使用。