Bir haritanın tüm tuşları üzerinde yineleme


316

Bir Go dil haritasındaki tüm tuşların bir listesini almanın bir yolu var mı? Eleman sayısı tarafından verilir len(), ancak aşağıdaki gibi bir harita varsa:

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

Tüm anahtarları nasıl tekrarlayabilirim?

Yanıtlar:


546

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

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

veya

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

forİfadeler için git dil özellikleri , ilk değerin anahtar, ikinci değişkenin değer olduğunu, ancak bulunması gerekmediğini belirtir.


22
Olası bir yakalama olarak, yineleme sırasının tanımsız olduğunu unutmayın. groups.google.com/d/msg/golang-nuts/YfDxpkI34hY/4pktJI2ytusJ
mna

23
Sudhir: golang language spec, haritaları açıkça anahtarların tanımlanmamış sırasına sahip olarak tanımlar. Ayrıca, Go 1'den bu yana, algılanan herhangi bir düzene bağımlılığı önlemek için anahtar sıra, çalıştırmalar arasında kasten rasgele dağıtılır.
Mark Renouf

6
Bunun değiştirilebilir bir yineleme olmadığını, yani bir anahtarın silinmesinin yinelemeyi yeniden başlatmanızı gerektireceğini unutmayın.
Rick Smith

Ayrıca küçük veri kümeleri için harita sırası tahmin edilebilir.
woot

14

sliceHarita tuşlarını bulmanın kolay yolu .

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

Keysİşlevin yalnızca dizelerle değil, herhangi bir tuşla bir harita alması mümkün müdür ?
Robert T. McGibbon

func Keys(m map[interface{}]interface{}) (keys []interface{}), @ RobertT.McGibbon "prototip" işlevini değiştirmeniz gerekiyor
a8m

1
@ArielM. Bu sadece tam tip için işe yarar map[interface{}]interface{}. Go jenerikleri desteklemez. mapFarklı anahtar türlerine sahip haritaları kabul eden bir parametreyle işlev oluşturamazsınız .
icza

10

Bir Go dil haritasındaki tüm tuşların bir listesini almanın bir yolu var mı?

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

tüm tuşları nasıl tekrarlayabilirim?

Kabul edilen cevabı kullanın:

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

1
Sanırım for _, k := range v.MapKeys(), örneğin örneğinizde, kanahtar diliminin int endeksi olacağını söylediniz
Brian Leishman
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.