[Go] 二次元のマップに値を入れるときに panic: assignment to entry in nil map が出ないようにする

作成日: 2022年01月15日

マップの中にマップが入っている二次元のマップの二次元目に値を入れる時に初期化が行われていない場合は panic: assignment to entry in nil map というエラーが出ます。二次元目の要素に値を入れるときに存在の確認を行い、存在しなければ初期化を行うかまたはマップごと入れることでエラーを回避することができます。

エラーが出るケース

変数 mmap[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]]
Go