go的初始化方式有很多種,在某些情況下容易引起重復初始化導致錯誤。
事例如下:
當使用gorm連接數據庫時定義了全局DB
var DB *gorm.DB
但是在后面某個函數內部初始化時導致DB重新初始化變成了局部變量,導致原來的全局變量DB還是nil
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("連接成功")}
}
以至于在后面的調用中報錯如下:
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,})}}
runtime error: invalid memory address or nil pointer dereference
所以要警惕兩種初始化方法重復使用。