Iterasi semua kunci peta

316

Apakah ada cara untuk mendapatkan daftar semua kunci di peta bahasa Go? Jumlah elemen diberikan oleh len(), tetapi jika saya memiliki peta seperti:

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

Bagaimana cara saya mengulang semua kunci?

Martin Redmond
sumber

Jawaban:

546

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

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

atau

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

Spesifikasi bahasa Go untuk forpernyataan menyatakan bahwa nilai pertama adalah kunci, variabel kedua adalah nilai, tetapi tidak harus ada.

Jonathan Feinberg
sumber
22
Sebagai gotcha yang mungkin, perhatikan bahwa urutan iterasi tidak ditentukan. groups.google.com/d/msg/golang-nuts/YfDxpkI34hY/4pktJI2ytusJ
mna
23
Sudhir: spec bahasa golang secara eksplisit mendefinisikan peta sebagai memiliki urutan kunci yang tidak ditentukan. Selanjutnya, sejak Go 1, urutan kunci sengaja diacak antara berjalan untuk mencegah ketergantungan pada urutan apa pun.
Mark Renouf
6
Perhatikan bahwa ini bukan iterasi yang dapat diubah, yang berarti menghapus kunci akan mengharuskan Anda untuk memulai kembali iterasi.
Rick Smith
Juga untuk set data kecil, urutan peta bisa diprediksi.
mainkan
14

Inilah beberapa cara mudah untuk mendapatkan slicekunci-peta.

// 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]
}
a8m
sumber
Mungkinkah Keysfungsi mengambil peta dengan kunci jenis apa pun, bukan hanya string?
Robert T. McGibbon
func Keys(m map[interface{}]interface{}) (keys []interface{}), @ RobertT.McGibbon Anda perlu mengubah fungsi "prototipe"
a8m
1
@ ArielM. Itu hanya akan bekerja untuk tipe yang tepat map[interface{}]interface{}. Go tidak mendukung obat generik. Anda tidak dapat membuat fungsi dengan mapparameter yang menerima peta dengan berbagai jenis kunci.
icza
10

Apakah ada cara untuk mendapatkan daftar semua kunci di peta bahasa Go?

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

bagaimana cara mengulang semua kunci?

Gunakan jawaban yang diterima:

for k, _ := range m { ... }
Sridhar
sumber
1
Saya pikir Anda maksudkan for _, k := range v.MapKeys(), karena dalam contoh Anda, kakan menjadi indeks int dari sepotong kunci
Brian Leishman