Scorrendo su tutte le chiavi di una mappa


316

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

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

Come posso scorrere tutte le chiavi?

Risposte:


546

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

Vai specifiche della lingua per le foristruzioni specifica che il primo valore è la chiave, la seconda variabile è il valore, ma non deve essere presente.


22
Come possibile gotcha, nota che l'ordine dell'iterazione non è definito. groups.google.com/d/msg/golang-nuts/YfDxpkI34hY/4pktJI2ytusJ
mna

23
Sudhir: le specifiche del linguaggio Golang definiscono esplicitamente le mappe con un ordinamento indefinito delle chiavi. Inoltre, da Go 1, l'ordine delle chiavi viene intenzionalmente randomizzato tra le esecuzioni per prevenire la dipendenza da qualsiasi ordine percepito.
Mark Renouf,

6
Si noti che questa non è un'iterazione mutabile, vale a dire che l'eliminazione di una chiave richiederà il riavvio dell'iterazione.
Rick Smith,

Anche per piccoli insiemi di dati, l'ordine delle mappe potrebbe essere prevedibile.
woot

14

Ecco un modo semplice per ottenere slicele chiavi 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]
}

È possibile per la Keysfunzione prendere una mappa con tasti di qualsiasi tipo, non solo stringhe?
Robert T. McGibbon,

func Keys(m map[interface{}]interface{}) (keys []interface{}), @ RobertT.McGibbon devi cambiare la funzione "prototipo"
a8m

1
@ArielM. Funzionerebbe solo per il tipo esatto map[interface{}]interface{}. Go non supporta i generici. Non è possibile creare una funzione con un mapparametro che accetta mappe con tipi di chiave diversi.
Icza,

10

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

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

come posso scorrere tutte le chiavi?

Usa la risposta accettata:

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

1
Penso che volevi dire for _, k := range v.MapKeys(), dal momento che nel tuo esempio ksarebbe l'indice int della porzione di chiavi
Brian Leishman,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.