When exploring nested maps in Golang, a series of code examples reveal apparent discrepancies:
func main() { var data = map[string]string{} data["a"] = "x" data["b"] = "x" data["c"] = "x" fmt.Println(data) }
This code runs successfully.
func main() { var data = map[string][]string{} data["a"] = append(data["a"], "x") data["b"] = append(data["b"], "x") data["c"] = append(data["c"], "x") fmt.Println(data) }
これも実行できます。
func main() { var w = map[string]string{} var data = map[string]map[string]string{} w["w"] = "x" data["a"] = w data["b"] = w data["c"] = w fmt.Println(data) }
これもまた実行できます。
しかし、以下のコードを実行するとエラーが発生します。
func main() { var data = map[string]map[string]string{} data["a"]["w"] = "x" data["b"]["w"] = "x" data["c"]["w"] = "x" fmt.Println(data) }
問題が発生します。
この問題の原因は、map型のゼロ値がnilであることです。ゼロ値は初期化されていません。nilマップに値を格納することはできません。これは実行時パニックです。
最後の例では、(外部の) dataマップを初期化しましたが、エントリはありません。data["a"]のようにインデックスを付けると、まだ"a"キーのエントリがないため、インデックス付けはnilという値型のゼロ値を返します。そのため、data"a"に代入しようとすると、実行時パニックとなります。
要素を格納する前にマップを初期化しなくてはなりません。以下に例を示します。
var data = map[string]map[string]string{} data["a"] = map[string]string{} data["b"] = make(map[string]string) data["c"] = make(map[string]string) data["a"]["w"] = "x" data["b"]["w"] = "x" data["c"]["w"] = "x" fmt.Println(data)
出力 (Go Playgroundで試してみる):
map[a:map[w:x] b:map[w:x] c:map[w:x]]
複合リテラルを使って変数map型を宣言し初期化すると、それも初期化とみなされます。
var data = map[string]map[string]string{ "a": map[string]string{}, "b": map[string]string{}, "c": map[string]string{}, } data["a"]["w"] = "x" data["b"]["w"] = "x" data["c"]["w"] = "x" fmt.Println(data)
出力は同じです。Go Playgroundで試してください。
以上がGo のネストされたマップは、直接アクセスするとランタイム パニックを引き起こすのに、追加や初期化を使用する場合にはパニックを引き起こさないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。