runtime error: invalid memory address or nil pointer dereference

1 개요[ | ]

runtime error: invalid memory address or nil pointer dereference
panic: runtime error: invalid memory address or nil pointer dereference
  • nil 포인터의 내용에 접근하려고 하면 panic
  • panic을 피하려면 nil이 아닌지 확인하고 nil이 아닌 경우에만 접근해야 한다.

2 예제 1[ | ]

Go
CPU
-1.0s
MEM
-0M
-1.0s
Copy
package main

import "fmt"

func main() {
	var n *int
	fmt.Println(*n)
}
panic: runtime error: invalid memory address or nil pointer dereference
[signal SIGSEGV: segmentation violation code=0x1 addr=0x0 pc=0x480fdc]

goroutine 1 [running]:
main.main()
	/home/user01/runbox.go:7 +0x1c
exit status 2

3 예제 2[ | ]

Go
Copy
package main

import "fmt"

type Point struct {
	X, Y float64
}

func main() {
	var p *Point
	fmt.Println(p.X) // panic: runtime error: invalid memory address or nil pointer dereference
}
Loading

4 예제 3[ | ]

Go
Copy
package main

import (
	"encoding/json"
	"fmt"
)

type MyObject struct {
	ID          int     `json:"id"`
	Name        string  `json:"name"`
	DisplayName *string `json:"displayName"`
}

func main() {
	var myObject1, myObject2 MyObject
	_ = json.Unmarshal([]byte(`{"id":1,"name":"hello","displayName":"hello everyone"}`), &myObject1)
	_ = json.Unmarshal([]byte(`{"id":2,"name":"world","displayName":nil}`), &myObject2)

	fmt.Printf("%+v\n", myObject1)              // {ID:1 Name:hello DisplayName:0xc000010350}
	fmt.Printf("%+v\n", myObject1.DisplayName)  // 0xc000010350
	fmt.Printf("%+v\n", *myObject1.DisplayName) // hello everyone
	fmt.Printf("%+v\n", myObject2)              // {ID:0 Name: DisplayName:<nil>}
	fmt.Printf("%+v\n", myObject2.DisplayName)  // <nil>
	fmt.Printf("%+v\n", *myObject2.DisplayName) // ★ panic: runtime error: invalid memory address or nil pointer dereference
}
Loading

5 같이 보기[ | ]

6 참고[ | ]