Heim >Backend-Entwicklung >Golang >Warum verursachen verschachtelte Karten in Go beim direkten Zugriff Laufzeitabstürze, nicht jedoch bei der Verwendung von „Anhängen' oder „Initialisierung'?
Bei der Erkundung verschachtelter Karten in Golang zeigen eine Reihe von Codebeispielen offensichtliche Diskrepanzen:
func main() { var data = map[string]string{} data["a"] = "x" data["b"] = "x" data["c"] = "x" fmt.Println(data) }
Dieser Code wird ausgeführt erfolgreich.
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) }
Sie können dies auch tun.
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) }
Dies ist auch möglich.
Wenn ich jedoch den folgenden Code ausführe, erhalte ich eine Fehlermeldung.
func main() { var data = map[string]map[string]string{} data["a"]["w"] = "x" data["b"]["w"] = "x" data["c"]["w"] = "x" fmt.Println(data) }
Es liegt ein Problem vor.
Die Ursache dieses Problems liegt darin, dass der Nullwert des Kartentyps Null ist. Der Nullwert ist nicht initialisiert. Sie können keine Werte in einer Nullkarte speichern. Dies ist eine Laufzeitpanik.
Im letzten Beispiel haben wir die (externe) Datenzuordnung initialisiert, aber es gibt keine Einträge. Wenn Sie wie data[„a“] indizieren, gibt es noch keinen Eintrag für den Schlüssel „a“, sodass die Indizierung einen Nullwert mit dem Werttyp „nil“ zurückgibt. Wenn Sie daher versuchen, Daten „a“ zuzuweisen, kommt es zur Laufzeitpanik.
Die Karte muss vor dem Speichern von Elementen initialisiert werden. Zum Beispiel:
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)
Ausgabe (Versuchen Sie es in Go Playground):
map[a:map[w:x] b:map[w:x] c:map[w:x]]
Wenn Sie einen Variablenkartentyp mit einem zusammengesetzten Literal deklarieren und initialisieren, wird dies ebenfalls als Initialisierung betrachtet.
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)
Die Ausgabe ist die gleiche. Probieren Sie es bei Go Playground aus.
Das obige ist der detaillierte Inhalt vonWarum verursachen verschachtelte Karten in Go beim direkten Zugriff Laufzeitabstürze, nicht jedoch bei der Verwendung von „Anhängen' oder „Initialisierung'?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!