1. 程式人生 > 其它 >gorm記憶體問題 runtime error: invalid memory address or nil pointer dereference

gorm記憶體問題 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