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'?

Warum verursachen verschachtelte Karten in Go beim direkten Zugriff Laufzeitabstürze, nicht jedoch bei der Verwendung von „Anhängen' oder „Initialisierung'?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-12-04 06:17:11821Durchsuche

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

Verschachtelte Karten in Golang: Erkundete Anomalien

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.

Untersuchung der Ursache

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn