はじめに
最近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と異なっていました
おわりに
新しい変数が出たら:=
を利用してしまう考えになっていたのが原因でした
今後は気を付けていきたいです
参考