ホームページ >バックエンド開発 >Golang >Go でネストされたマップを使用するときに実行時のパニックを回避するにはどうすればよいですか?

Go でネストされたマップを使用するときに実行時のパニックを回避するにはどうすればよいですか?

DDD
DDDオリジナル
2024-12-06 06:30:12199ブラウズ

How Do I Avoid Runtime Panics When Using Nested Maps in Go?

Go のネストされたマップ

Go では、マップはキーと値のペアを保存できる強力なデータ構造です。値自体がマップであるネストされたマップは、複雑なデータを整理するのに便利な方法です。

問題

ただし、一部の開発者は、ネストされたマップを使用するときに問題に遭遇しました。たとえば、次のコード スニペットは正常に実行されます:

func main() {
    var data = map[string]string{}
    data["a"] = "x"
    data["b"] = "x"
    data["c"] = "x"
    fmt.Println(data)
}

次のコードも同様です:

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 data = map[string]map[string]string{}
    data["a"]["w"] = "x"
    data["b"]["w"] = "x"
    data["c"]["w"] = "x"
    fmt.Println(data)
}

説明

この問題は、Go のマップ タイプのゼロ値が nil であり、マップが初期化されていません。 nil マップにアクセスまたは値を保存しようとすると、実行時パニックが発生します。

最後の例では、(外側の) データ マップは初期化されますが、エントリはありません。 data["a"] のようにインデックスを付けると、「a」キーを持つエントリがまだないため、インデックスを付けると値型のゼロ値 (マップの場合は nil) が返されます。データ「a」への代入は nil マップへの代入を試行することになり、パニックが発生します。

解決策

この問題を回避するには、要素を格納する前にマップを初期化する必要があります。 。これはいくつかの方法で行うことができます:

  • 複合リテラルを使用して外部マップを初期化します:
var data = map[string]map[string]string{
    "a": {},
    "b": {},
    "c": {},
}
  • メーカーを使用するfunction:
var data = make(map[string]map[string]string)
  • 内部マップを個別に初期化します:
var data = map[string]map[string]string{}

data["a"] = map[string]string{}
data["b"] = make(map[string]string)
data["c"] = make(map[string]string)

初期化後、安全にネストされたマップに値を保存します。

以上がGo でネストされたマップを使用するときに実行時のパニックを回避するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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