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?

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.


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

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 { ... }

1
Saya pikir Anda maksudkan for _, k := range v.MapKeys(), karena dalam contoh Anda, kakan menjadi indeks int dari sepotong kunci
Brian Leishman
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.