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


317

Existe-t-il un moyen d'obtenir une liste de toutes les clés d'une carte de langue 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 parcourir toutes les clés?

Réponses:


547

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

Aller aux spécifications de langue pour les forinstructions 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.


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

23
Sudhir: la spécification du langage golang définit explicitement les cartes comme ayant un ordre non défini de clés. De plus, depuis Go 1, l'ordre des clés est intentionnellement randomisé entre les exécutions pour éviter la dépendance à tout ordre perçu.
Mark Renouf

6
Notez qu'il ne s'agit pas d'une itération modifiable, c'est-à-dire que la suppression d'une clé vous obligera à redémarrer l'itération.
Rick Smith

Pour les petits ensembles de données également, l'ordre des cartes pourrait être prévisible.
woot

14

Voici un moyen simple d'obtenir sliceles clés de 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]
}

Est-il possible pour la Keysfonction de prendre une carte avec des touches de tout type, pas seulement des chaînes?
Robert T. McGibbon

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

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

10

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

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

comment puis-je parcourir toutes les clés?

Utilisez la réponse acceptée:

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

1
Je pense que vous vouliez dire for _, k := range v.MapKeys(), puisque dans votre exemple, kserait l'index int de la tranche de clés
Brian Leishman
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.