Heim >Backend-Entwicklung >Golang >Wie vermeide ich Laufzeitprobleme bei der Verwendung verschachtelter Karten in Go?

Wie vermeide ich Laufzeitprobleme bei der Verwendung verschachtelter Karten in Go?

DDD
DDDOriginal
2024-12-06 06:30:12199Durchsuche

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

Verschachtelte Karten in Go

In Go sind Karten eine leistungsstarke Datenstruktur, mit der Sie Schlüssel-Wert-Paare speichern können. Verschachtelte Karten, bei denen die Werte selbst Karten sind, können eine nützliche Möglichkeit sein, komplexe Daten zu organisieren.

Problem

Einige Entwickler sind jedoch auf Probleme bei der Arbeit mit verschachtelten Karten gestoßen. Beispielsweise wird das folgende Code-Snippet erfolgreich ausgeführt:

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

Und das Folgende auch:

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)
}

Aber der folgende Code gerät zur Laufzeit in Panik:

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

Erklärung

Das Problem entsteht, weil der Nullwert für Kartentypen in Go Null ist, was darauf hinweist, dass die Karte vorhanden ist nicht initialisiert. Der Versuch, auf Werte in einer Null-Map zuzugreifen oder diese zu speichern, führt zu einer Laufzeitpanik.

Im letzten Beispiel wird die (äußere) Daten-Map initialisiert, hat aber keine Einträge. Wenn Sie es wie data["a"] indizieren, gibt die Indizierung den Nullwert des Werttyps zurück, da es noch keinen Eintrag mit dem Schlüssel "a" gibt, was bei Karten Null ist. Das Zuweisen zu Daten „a“ wird dann zu einem Versuch, einer Null-Karte zuzuweisen, was zu einer Panik führt.

Lösung

Um dieses Problem zu vermeiden, müssen Sie eine Karte initialisieren, bevor Sie Elemente darin speichern . Dies kann auf verschiedene Arten erfolgen:

  • Initialisieren Sie die äußere Karte mit einem zusammengesetzten Literal:
var data = map[string]map[string]string{
    "a": {},
    "b": {},
    "c": {},
}
  • Benutzen Sie die Marke Funktion:
var data = make(map[string]map[string]string)
  • Initialisieren Sie die inneren Karten einzeln:
var data = map[string]map[string]string{}

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

Nach der Initialisierung können Sie sicher Werte in den verschachtelten Karten speichern.

Das obige ist der detaillierte Inhalt vonWie vermeide ich Laufzeitprobleme bei der Verwendung verschachtelter Karten in Go?. 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