2009-12-03 6 views
187

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ée par len(), mais si j'ai une carte comme:Itérer sur toutes les touches d'une carte

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

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

Répondre

310

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

Go language specs for for statements spécifie que la première valeur est la clé, la deuxième variable est la valeur, mais ne doit pas être présent.

+9

En tant que Gotcha possible, notez que l'ordre de l'itération est définie. https://groups.google.com/d/msg/golang-nuts/YfDxpkI34hY/4pktJI2ytusJ – mna

+15

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

+3

Notez qu'il ne s'agit pas d'une itération modifiable, c'est-à-dire que la suppression d'une clé nécessite le redémarrage de l'itération. –

8

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

Est-il possible que la fonction 'Keys' prenne une carte avec des clés de n'importe quel type, pas seulement des chaînes? –

+0

'func Touches (m carte [interface {}] interface {}) (touches [] 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 supporte pas les génériques. Vous ne pouvez pas créer une fonction avec un paramètre 'map' qui accepte les cartes avec différents types de clé. – icza

2

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

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

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

Utilisez la réponse acceptée:

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