ホームページ >バックエンド開発 >Golang >Go でマップに代入すると「ランタイム エラー: nil マップのエントリへの代入」が発生するのはなぜですか?またその修正方法は何ですか?

Go でマップに代入すると「ランタイム エラー: nil マップのエントリへの代入」が発生するのはなぜですか?またその修正方法は何ですか?

Susan Sarandon
Susan Sarandonオリジナル
2024-12-03 22:27:12203ブラウズ

Why Does Assigning to a Map in Go Result in a

マップ割り当ての実行時エラー

質問:

マップを変換しようとしたときYAML ファイルを実行すると、「実行時エラー: nil マップのエントリへの割り当て」というエラーが発生します。次のコード スニペットを確認してください:

package main

import (
    "fmt"
    "gopkg.in/yaml.v2"
)

type T struct {
    cn     string
    street string
}

func main() {
    names := []string{"kasi", "remya", "nandan"}

    m := make(map[string]map[string]T, len(names))
    for _, name := range names {

        //t := T{cn: "Chaithra", street: "fkmp"}

        m["uid"][name] = T{cn: "Chaithra", street: "fkmp"}

    }
    fmt.Println(m)

    y, _ := yaml.Marshal(&m)

    fmt.Println(string(y))
    //fmt.Println(m, names)
}

このエラーの原因と解決方法は何ですか?

答え:

問題は次のとおりです。外部マップ内の内部マップの初期化で。この例では、マップ m["uid"] が初期化されていないため、マップに名前を割り当てようとすると nil マップが生成されます。

内部マップを初期化するには、for の前に次の行を追加します。ループ:

m["uid"] = make(map[string]T)

これにより内部マップが作成され、nil マップ エラーが発生することなく名前をそれに割り当てることができます。

修正されたコードは次のようになります:

func main() {
    names := []string{"kasi", "remya", "nandan"}

    m := make(map[string]map[string]T, len(names))
    m["uid"] = make(map[string]T) // Initialize the inner map

    for _, name := range names {
        m["uid"][name] = T{cn: "Chaithra", street: "fkmp"}
    }
    fmt.Println(m)

    y, _ := yaml.Marshal(&m)

    fmt.Println(string(y))
    //fmt.Println(m, names)
}

以上がGo でマップに代入すると「ランタイム エラー: nil マップのエントリへの代入」が発生するのはなぜですか?またその修正方法は何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。