複数のキーを持つ2次元の辞書のようなデータ構造を使いたい時がある. 変数の定義自体は,Go言語で以下のように行える.

var map2d map[string]map[string]string

ただ,1次元のmapのようにそのまま使用する事が出来ない.

map2d["hoge"]["huga"] = "poyo"

などと代入しようとすると, panic: assignment to entry in nil map となってエラーになってしまう. これは, mapの中のmapへのポインタがnilになっているために発生します.

これを解決するには,初期化を正しく行う必要があります.

var map2d map[string]map[string]string


if _, ok := m["hoge"]; !ok {
    map2d["hoge"] = make(map[string]string)
}
map2d["hoge"]["huga"] = "poyo"

これは面倒なので,対策としては,map in mapを諦めるのが良いと思います.

type mapKeys strcut {
    key1 string
    key2 string
}

var map2d map[mapKeys]string

map[mapKeys{"hoge", "huga"}] = "poyo"

これで1次元のmapなのでエラーはでないし,要素2つをKeyにとれてる,

自分のアイデアではないが,自分用のメモとして,記録.

参考リンク