2009-12-03 5 views
187

C'è un modo per ottenere un elenco di tutte le chiavi in ​​una mappa di lingua Go? Il numero di elementi è dato da len(), ma se ho una mappa simile:iterare su tutte le chiavi di una mappa

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

Come faccio a iterare su tutte le chiavi?

risposta

310

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

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

o

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

Go language specs for for statements specifica che il primo valore è la chiave, la seconda variabile è il valore, ma non deve essere presente.

+9

Come possibile Gotcha, notare che l'ordine dell'iterazione è indefinito. https://groups.google.com/d/msg/golang-nuts/YfDxpkI34hY/4pktJI2ytusJ – mna

+15

Sudhir: golang lingua specifica definisce esplicitamente mappe come avente ordinamento indefinita di chiavi. Inoltre, poiché Go 1, l'ordine delle chiavi è intenzionalmente casuale tra le esecuzioni per impedire la dipendenza da qualsiasi ordine percepito. –

+3

Si noti che questo non è un un'iterazione mutabile, vale a dire l'eliminazione di una chiave richiederà di riavviare l'iterazione. –

8

Ecco un modo semplice per ottenere slice dei tasti della mappa.

// 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

È possibile che la funzione 'Chiavi' esegua una mappa con chiavi di qualsiasi tipo, non solo stringhe? –

+0

'FUNC Chiavi (m mappa [interfaccia {}] interfaccia {}) (tasti di interfaccia [] {})', @ RobertT.McGibbon è necessario modificare la funzione di "prototipo" – a8m

+1

@ArielM. Ciò funzionerebbe solo con il tipo esatto 'map [interface {}] interface {}'. Go non supporta i farmaci generici. Non è possibile creare una funzione con un parametro 'map' che accetta mappe con diversi tipi di chiave. – icza

2

C'è un modo per ottenere un elenco di tutte le chiavi in ​​una mappa di lingua Go?

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

Come faccio a iterare su tutte le chiavi?

Utilizzare la risposta accettata:

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