runtime error: invalid memory address or nil pointer dereferenceの原因・解決方法

Golang

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フィールドが値を持っているため、デリファレンスしても問題なく扱うことが可能です。

タイトルとURLをコピーしました