3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Goで go invalid memory address or nil pointer dereference エラーが発生する

Posted at

はじめに

最近Goを仕事で初めて、色々な記事を参考にREST APIを作成していました
そこで変数のポインタに関するエラーが発生したのでまとめます

初心者ならやりそうなミスだと思うので多くの方の参考になればと思います

問題

以下のコードで変数DB(gorm)の初期設定を行いました

base.go
var DB *gorm.DB
var err error

func init() {
	checkDB()
	dsn := config.Config.DBName
	DB, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
	if err != nil {
		log.Fatalln(err)
	}
	migrate(DB)
}

そしてそこで設定した変数DBを利用して以下の関数でユーザーを取得します

user.go
func GetUserByEmail(e string) User {
	user := User{}
	DB.Where("Email = ?", e).First(&user)
	return user
}

この関数を実行すると以下のエラーが発生しました

go invalid memory address or nil pointer dereference DB

DBの値がnilになっているというエラーでした
base.goでgormを使った初期化をDBに代入しているのになぜかわかりませんでした

解決方法

base.goのコードを変更して解決しました

DB, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
↓
DB, err = gorm.Open(mysql.Open(dsn), &gorm.Config{})

エラーが出るコードではDBに代入しているのではなく、DBというスコープ内だけで有効な変数を新規で作成し(グローバルのDBとは違うメモリを参照)、user.goで参照しているDBと異なっていました

おわりに

新しい変数が出たら:=を利用してしまう考えになっていたのが原因でした
今後は気を付けていきたいです

参考

3
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?