[Go] 二次元のマップに値を入れるときに panic: assignment to entry in nil map が出ないようにする
作成日: 2022年01月15日
マップの中にマップが入っている二次元のマップの二次元目に値を入れる時に初期化が行われていない場合は panic: assignment to entry in nil map
というエラーが出ます。二次元目の要素に値を入れるときに存在の確認を行い、存在しなければ初期化を行うかまたはマップごと入れることでエラーを回避することができます。
エラーが出るケース
変数 m
を map[string]map[string]int{}
で初期化を行っていたとしてもすぐに二次元目の要素に値を入れようとするとエラーが発生します。
package main
import "fmt"
func main() {
var m map[string]map[string]int = map[string]map[string]int{}
m["a"]["b"] = 1
fmt.Println(m)
}
実行結果は下記となります。
panic: assignment to entry in nil map
goroutine 1 [running]:
main.main()
/home/***/***/***/***/main.go:7 +0x58
exit status 2
エラーが出ないケース
初期化する方法
package main
import "fmt"
func main() {
var m map[string]map[string]int = map[string]map[string]int{}
if _, ok := m["a"]["b"]; ok {
m["a"]["b"] = 1
} else {
m["a"] = map[string]int{}
m["a"]["b"] = 1
}
fmt.Println(m)
}
マップごと入れる方法
package main
import "fmt"
func main() {
var m map[string]map[string]int = map[string]map[string]int{}
if _, ok := m["a"]["b"]; ok {
m["a"]["b"] = 1
} else {
m["a"] = map[string]int{"b": 1}
}
fmt.Println(m)
}
実行結果はいずれも下記となります。
map[a:map[b:1]]