71 votes

Imbriqués les cartes en Golang

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

Il s'exécute.

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

Il fonctionne également.

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

Il fonctionne à nouveau!

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

Mais il tombe en panne!?

Est-il un problème avec imbriqué cartes dans le jeu de Go? Ou n'est-il pas de multiples support pour imbriqués les cartes?

100voto

icza Points 3857

La valeur zéro pour les types de carte est - nil. Il n'est pas encore initialisé. Vous ne pouvez pas stocker des valeurs en nil carte, c'est un moteur d'exécution de panique.

Dans votre dernier exemple de l'initialisation de l' (extérieur) - data carte, mais il n'a pas d'entrées. Lors de l'indexation comme data["a"], car il n'y a pas d'entrée avec l' "a" clé en elle encore, l'indexation, elle retourne la valeur zéro de la valeur type nil pour les cartes. Afin de tenter d'attribuer à l' data["a"]["w"] est un moteur d'exécution de panique.

Vous devez les initialiser une carte tout d'abord avant de stocker des éléments qui le composent, par exemple:

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)

De sortie (essayez sur la Aller de l'aire de Jeux):

map[a:map[w:x] b:map[w:x] c:map[w:x]]

Notez que lorsque vous déclarez une variable de type de carte et de l'initialiser avec un composite littérale (comme en var data = map[string]string{}), qui compte aussi comme initialisation.

Notez que vous pouvez également initialiser votre imbriqués les cartes avec un composite littérale:

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)

La sortie est la même. Essayez sur la Aller de l'aire de Jeux.

16voto

Dominic Barnes Points 13815

Alors que la plupart de réponse simple à cette question est d'initialiser votre imbriquée cartes comme décrit précédemment, il existe une autre possibilité en fonction de votre modèle d'accès. Si vous avez besoin d'un véritable système hiérarchique de cartes, puis les réponses précédentes sont juste très bien. Toutefois, si vous avez simplement besoin de rechercher des valeurs dans la carte à l'aide de multiples facettes, à lire!

Il est tout à fait acceptable pour les cartes à utiliser les structures comme des clés (en fait, tout ce qui est comparable peut être utilisé). Ainsi, vous pouvez utiliser une carte unique struct clés comme cet exemple de la Golang blog, qui est un compteur qui suit coups de page par pays:

type Key struct {
  Path, Country string
}

hits := make(map[Key]int)

// set: Vietnamese person visiting the home page
hits[Key{"/", "vn"}]++

// get: see how many Chinese persons read the spec
n := hits[Key{"/ref/spec", "cn"}]

Je ne vois pas de cartes comme cela assez souvent, au lieu de cela beaucoup de gens atteignent pour le sous-variante de la première, qui, je pense, ne peut pas toujours être le bon ajustement.

13voto

Vladimir Filin Points 31

En plus de icza de réponse. La carte d'initialisation peut être écrite sous la forme courte:

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

La sortie est la même. Essayez sur la Aller de l'aire de Jeux. La touche "d" ajouté à démontrer la cartographie avec une carte vide.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X