351 votes

Itération sur toutes les clés d'une carte

Existe-t-il un moyen d'obtenir une liste de toutes les clés dans une carte de langage Go ? Le nombre d'éléments est donné par len() mais si j'ai une carte comme :

m := map[string]string{ "key1":"val1", "key2":"val2" };

Comment puis-je itérer sur toutes les clés ?

605voto

Jonathan Feinberg Points 24791

https://play.golang.org/p/JGZ7mN0-U-

for k, v := range m { 
    fmt.Printf("key[%s] value[%s]\n", k, v)
}

ou

for k := range m {
    fmt.Printf("key[%s] value[%s]\n", k, m[k])
}

Spécifications du langage Go pour for déclarations spécifie que la première valeur est la clé, la deuxième variable est la valeur, mais ne doit pas nécessairement être présente.

24 votes

Comme un gotcha possible, notez que l'ordre de l'itération est indéfini. groups.google.com/d/msg/golang-nuts/YfDxpkI34hY/4pktJI2ytusJ

23 votes

Sudhir : la spécification du langage golang définit explicitement les maps comme ayant un ordre indéfini des clés. De plus, depuis Go 1, l'ordre des clés est intentionnellement aléatoire entre les exécutions pour éviter toute dépendance à un ordre perçu.

6 votes

Notez qu'il ne s'agit pas d'une itération mutable, c'est-à-dire que la suppression d'une clé nécessitera de recommencer l'itération.

17voto

Ariel M. Points 141

Voici un moyen facile d'obtenir slice des touches de la carte.

// Return keys of the given map
func Keys(m map[string]interface{}) (keys []string) {
    for k := range m {
        keys = append(keys, k)
    }
    return keys
}

// use `Keys` func
func main() {
    m := map[string]interface{}{
        "foo": 1,
        "bar": true,
        "baz": "baz",
    }
    fmt.Println(Keys(m)) // [foo bar baz]
}

0 votes

Est-il possible que le Keys pour prendre une carte avec des clés de n'importe quel type, pas seulement des chaînes de caractères ?

0 votes

func Keys(m map[interface{}]interface{}) (keys []interface{}) @RobertT.McGibbon, vous devez modifier la fonction "prototype".

1 votes

@ArielM. Cela ne fonctionnerait que pour le type exact map[interface{}]interface{} . Go ne supporte pas les génériques. Vous ne pouvez pas créer une fonction avec un map qui accepte les cartes avec différents types de clés.

14voto

sridhara Points 416

Existe-t-il un moyen d'obtenir une liste de toutes les clés dans une carte de langue Go ?

ks := reflect.ValueOf(m).MapKeys()

comment faire pour itérer sur toutes les clés ?

Utilisez la réponse acceptée :

for k, _ := range m { ... }

2 votes

Je pense que tu voulais dire for _, k := range v.MapKeys() puisque dans votre exemple, k serait l'index int de la tranche de clés

2voto

Mohsen Points 602

Une solution agnostique :

for _, key := range reflect.ValueOf(yourMap).MapKeys() {
    value := s.MapIndex(key).Interface()
    fmt.Println("Key:", key, "Value:", value)
}

-1voto

Lan Vukušič Points 25

C'est également une option

 for key, element := range myMap{
    fmt.Println("Key:", key, "Element:", element)
 }

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