ホームページ > バックエンド開発 > Golang > Go のネストされたマップは、直接アクセスするとランタイム パニックを引き起こすのに、追加や初期化を使用する場合にはパニックを引き起こさないのはなぜですか?

Go のネストされたマップは、直接アクセスするとランタイム パニックを引き起こすのに、追加や初期化を使用する場合にはパニックを引き起こさないのはなぜですか?

Mary-Kate Olsen
リリース: 2024-12-04 06:17:11
オリジナル
818 人が閲覧しました

Why Do Nested Maps in Go Cause Runtime Panics When Accessed Directly, But Not When Using Append or Initialization?

Nested Maps in Golang: Anomalies Explored

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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート