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?

Martin Redmond
la source

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.

Jonathan Feinberg
la source
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]
}
a8m
la source
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 { ... }
Sridhar
la source
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