runtime error: invalid memory address or nil pointer dereference


개요

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

예제 1

package main

import "fmt"

func main() {
	var n *int
	fmt.Println(*n)
}

예제 2

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
}

예제 3

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
}

같이 보기

참고