2009-12-03 8 views
187

Gibt es eine Möglichkeit, eine Liste aller Schlüssel in einer Go-Sprachkarte zu erhalten? Die Anzahl der Elemente wird durch len() gegeben, aber wenn ich eine Karte wie:Iterieren über alle Schlüssel einer Karte

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

Wie iterieren ich über alle Schlüssel?

Antwort

310

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

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

oder

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

Go language specs for for statements gibt an, dass der erste Wert der Schlüssel ist, wobei die zweite Variable den Wert, aber muss nicht vorhanden sein.

+9

Als mögliche gotcha, beachten Sie, dass die Reihenfolge der Iteration nicht definiert ist. https://groups.google.com/d/msg/golang-nuts/YfDxpkI34hY/4pktJI2ytusJ – mna

+15

Sudhir: Die Golang-Sprachspezifikation definiert explizit Karten mit nicht definierter Reihenfolge der Schlüssel. Außerdem wird seit Go 1 die Reihenfolge der Schlüssel absichtlich zwischen den Läufen randomisiert, um eine Abhängigkeit von einer wahrgenommenen Reihenfolge zu verhindern. –

+3

Beachten Sie, dass dies keine veränderbare Iteration ist, dh das Löschen eines Schlüssels erfordert einen Neustart der Iteration. –

8

Hier ist ein einfacher Weg, um slice der Map-Schlüssel zu erhalten.

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

Ist es möglich, dass die Funktion 'Keys' eine Karte mit Schlüsseln eines beliebigen Typs, nicht nur mit Strings, erstellt? –

+0

'func Keys (m Karte [Schnittstelle {}] Schnittstelle {}) (Schlüssel [] Schnittstelle {})', @ RobertT.McGibbon müssen Sie die Funktion "Prototyp" – a8m

+1

@ArielM ändern. Das würde nur für den exakten Typ 'map [interface {}] interface {}' funktionieren. Go unterstützt keine Generika. Sie können keine Funktion mit einem 'map' -Parameter erstellen, der Karten mit unterschiedlichen Schlüsseltypen akzeptiert. – icza

2

Gibt es eine Möglichkeit, eine Liste aller Schlüssel in einer Go Sprache Karte zu bekommen?

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

wie kann ich über alle Tasten durchlaufen?

Verwenden Sie die akzeptierte Antwort:

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