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
Freigeben: 2024-12-04 06:17:11
Original
818 Leute haben es durchsucht

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)
}
Nach dem Login kopieren

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)
}
Nach dem Login kopieren

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)
}
Nach dem Login kopieren

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)
}
Nach dem Login kopieren

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)
Nach dem Login kopieren

Ausgabe (Versuchen Sie es in Go Playground):

map[a:map[w:x] b:map[w:x] c:map[w:x]]
Nach dem Login kopieren

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)
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage