Iterowanie po wszystkich klawiszach mapy


316

Czy istnieje sposób na uzyskanie listy wszystkich kluczy na mapie językowej Go? Liczba elementów jest podana przez len(), ale jeśli mam mapę, taką jak:

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

Jak iterować po wszystkich kluczach?

Odpowiedzi:


546

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

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

lub

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

Specyfikacje języka Go dla forinstrukcji określa, że ​​pierwsza wartość jest kluczem, druga zmienna jest wartością, ale nie musi być obecna.


22
Jako możliwe gotcha, zauważ, że kolejność iteracji jest niezdefiniowana. groups.google.com/d/msg/golang-nuts/YfDxpkI34hY/4pktJI2ytusJ
— mna

23
Sudhir: specyfikacja języka golang wyraźnie definiuje mapy jako posiadające nieokreśloną kolejność kluczy. Ponadto, odkąd Go 1, kolejność kluczy jest celowo losowo wybierana między seriami, aby zapobiec zależności od jakiejkolwiek postrzeganej kolejności.
— Mark Renouf

6
Zauważ, że nie jest to zmienna iteracja, co oznacza, że ​​usunięcie klucza będzie wymagało ponownego uruchomienia iteracji.
— Rick Smith

Również w przypadku małych zestawów danych kolejność map może być przewidywalna.
— woot

14

Oto prosty sposób na zdobycie sliceklawiszy mapy.

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

Czy Keysfunkcja może pobrać mapę z kluczami dowolnego typu, a nie tylko z ciągami znaków?
— Robert T. McGibbon,

func Keys(m map[interface{}]interface{}) (keys []interface{}), @ RobertT.McGibbon musisz zmienić funkcję „prototyp”
— a8m

1
@ArielM. To działałoby tylko w przypadku konkretnego typu map[interface{}]interface{}. Go nie obsługuje rodzajów ogólnych. Nie można utworzyć funkcji z mapparametrem, który akceptuje mapy z różnymi typami kluczy.
— icza

10

Czy istnieje sposób na uzyskanie listy wszystkich kluczy na mapie językowej Go?

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

jak iterować po wszystkich kluczach?

Użyj zaakceptowanej odpowiedzi:

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

1
Myślę, że miałeś na myśli for _, k := range v.MapKeys(), ponieważ w twoim przykładzie kbędzie to int indeks części klucza
— Brian Leishman
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.