Maison >développement back-end >Golang >Comment puis-je éviter les paniques d'exécution lors de l'utilisation de cartes imbriquées dans Go ?

Comment puis-je éviter les paniques d'exécution lors de l'utilisation de cartes imbriquées dans Go ?

DDD
DDDoriginal
2024-12-06 06:30:12199parcourir

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

Cartes imbriquées dans Go

Dans Go, les cartes sont une structure de données puissante qui vous permet de stocker des paires clé-valeur. Les cartes imbriquées, où les valeurs sont elles-mêmes des cartes, peuvent être un moyen utile d'organiser des données complexes.

Problème

Cependant, certains développeurs ont rencontré des problèmes lorsqu'ils travaillaient avec des cartes imbriquées. Par exemple, l'extrait de code suivant s'exécute avec succès :

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

Et ce qui suit aussi :

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

Mais le code suivant panique au moment de l'exécution :

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

Explication

Le problème se pose car la valeur zéro pour les types de carte dans Go est nulle, indiquant que la carte n'est pas initialisée. Tenter d'accéder ou de stocker des valeurs dans une carte nulle entraîne une panique d'exécution.

Dans le dernier exemple, la carte de données (externe) est initialisée, mais elle n'a aucune entrée. Lorsque vous l'indexez comme data["a"], puisqu'il n'y a pas encore d'entrée avec la clé "a", l'indexer renvoie la valeur zéro du type valeur, qui est nulle pour les cartes. Attribuer à la donnée "a" devient alors une tentative d'affectation à une carte nulle, entraînant une panique.

Solution

Pour éviter ce problème, vous devez initialiser une carte avant d'y stocker des éléments . Cela peut être fait de plusieurs manières :

  • Initialiser la carte externe avec un littéral composite :
var data = map[string]map[string]string{
    "a": {},
    "b": {},
    "c": {},
}
  • Utilisez la marque fonction :
var data = make(map[string]map[string]string)
  • Initialiser les cartes intérieures individuellement :
var data = map[string]map[string]string{}

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

Après l'initialisation, vous pouvez en toute sécurité stocker les valeurs dans les cartes imbriquées.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn