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