web-dev-qa-db-fra.com

Créer une carte des listes

Je voudrais créer une carte de container/list.List instances. Est-ce la bonne façon de procéder?

package main

import (
    "fmt"
    "container/list"
)

func main() {
    x := make(map[string]*list.List)

    x["key"] = list.New()
    x["key"].PushBack("value")

    fmt.Println(x["key"].Front().Value)
}
45
Carson

Chaque fois que j'ai voulu utiliser un List j'ai trouvé qu'une tranche était le bon choix, par exemple

package main

import "fmt"

func main() {
    x := make(map[string][]string)

    x["key"] = append(x["key"], "value")
    x["key"] = append(x["key"], "value1")

    fmt.Println(x["key"][0])
    fmt.Println(x["key"][1])
}
92
Nick Craig-Wood

Ma syntaxe préférée pour déclarer une carte de tranches:

mapOfSlices := map[string][]string{
    "first": {},
    "second": []string{"one", "two", "three", "four", "five"},
    "third": []string{"quarter", "half"},
}
16
Sam Houston

il n'y a rien de techniquement incorrect dans ce que vous avez écrit, mais vous devez définir votre propre type autour de map[string]*list.List pour éviter certains écueils, comme essayer d'appeler la méthode .Front() sur un pointeur nul. Ou faites-en un map[string]list.List Pour éviter cette situation. Une list.List n'est qu'une paire de pointeurs et une valeur de longueur; en utilisant un pointeur list.List dans votre carte ajoute simplement la casse supplémentaire d'un pointeur nul au-dessus du cas d'une liste vide. Dans les deux cas, vous devez définir une nouvelle structure pour ce cas d'utilisation.

Je serais enclin à l'écrire comme ceci: http://play.golang.org/p/yCTYdGVa5G

9
jorelli