invalid memory address or nil pointer dereferenceの原因とは
ポインタ型の値がnilである時に、(*)を付けてデリファレンスすると以下のエラーが発生します。
panic: runtime error: invalid memory address or nil pointer dereference
上記のエラー文を翻訳すると、
無効なメモリアドレスまたはnilポインタのデリファレンス
とのこと。
以下でこのエラーの解決方法について詳しく解説します。
解決方法:nilポインタのデリファレンスをしない
ポインタ型の変数や構造体のフィールドがnilの時に、デリファレンスしないようにしましょう。
以下のコードはPerson構造体のゼロ値(p1)に対して、ポインタ型のフィールドであるjobをデリファレンスしているので、エラーが発生します。
package main
import "fmt"
type Person struct {
name string
age int
job *string
}
func main() {
var p1 Person
fmt.Printf("%+v\n", p1) // {name: age:0 job:<nil>}
fmt.Println(*p1.job) // panic: runtime error: invalid memory address or nil pointer dereference
// [signal SIGSEGV: segmentation violation code=0x1 addr=0x0 pc=0x108b7ee]
}
なので、エラーが出ないようにするには、Person構造体のjobフィールドに値を入れてあげれば大丈夫です。
package main
import "fmt"
type Person struct {
name string
age int
job *string
}
func main() {
job := "teacher"
p2 := Person{
name: "田中",
age: 30,
job: &job,
}
fmt.Printf("%+v\n", p2) // {name:田中 age:30 job:0xc000010230}
fmt.Println(*p2.job) // teacher
}
p2はポインタ型のjobフィールドが値を持っているため、デリファレンスしても問題なく扱うことが可能です。