Apakah ada cara yang lebih sederhana / lebih baik untuk mendapatkan sepotong kunci dari peta di Go?
Saat ini saya mengulangi peta dan menyalin kunci ke sebuah irisan:
i := 0
keys := make([]int, len(mymap))
for k := range mymap {
keys[i] = k
i++
}
Jawaban:
Sebagai contoh,
Agar efisien di Go, penting untuk meminimalkan alokasi memori.
sumber
mymap
bukan variabel lokal (dan karena itu tunduk pada tumbuh / menyusut), ini adalah satu-satunya solusi yang tepat - itu memastikan bahwa jika ukuranmymap
perubahan antara inisialisasikeys
danfor
loop, tidak akan ada keluaran masalah-masalah di luar batas.Ini pertanyaan lama, tapi ini dua sen saya. Jawaban PeterSO sedikit lebih ringkas, tetapi sedikit kurang efisien. Anda sudah tahu seberapa besar itu sehingga Anda bahkan tidak perlu menggunakan append:
Dalam kebanyakan situasi mungkin tidak akan membuat banyak perbedaan, tapi itu tidak banyak bekerja, dan dalam pengujian saya (menggunakan peta dengan 1.000.000
int64
kunci acak dan kemudian menghasilkan array kunci sepuluh kali dengan masing-masing metode), itu tentang 20% lebih cepat untuk menetapkan anggota array secara langsung daripada menggunakan append.Meskipun pengaturan kapasitas menghilangkan realokasi, append masih harus melakukan pekerjaan ekstra untuk memeriksa apakah Anda telah mencapai kapasitas pada setiap append.
sumber
for i, k := range mymap{
,. Dengan begitu Anda tidak perlu i ++?i, k := range mymap
, makai
akan menjadi kunci dank
akan menjadi nilai yang sesuai dengan kunci tersebut di peta. Itu tidak akan benar-benar membantu Anda mengisi sepotong kunci.Anda juga dapat mengambil larik kunci dengan jenis
[]Value
menurut metodeMapKeys
structValue
dari paket "mencerminkan":sumber
[]string
?Cara yang lebih baik untuk melakukan ini adalah dengan menggunakan
append
:Selain itu, Anda kurang beruntung — Go bukan bahasa yang sangat ekspresif.
sumber
keys = make([]int, 0, len(mymap))
akan menyingkirkan alokasi tetapi saya berharap itu akan lebih lambat.Saya membuat patokan samar pada tiga metode yang dijelaskan dalam tanggapan lain.
Jelas pra-alokasi potongan sebelum menarik kunci lebih cepat daripada
append
ing, tetapi mengejutkan,reflect.ValueOf(m).MapKeys()
metode ini jauh lebih lambat daripada yang terakhir:Berikut kodenya: https://play.golang.org/p/Z8O6a2jyfTH (menjalankannya di taman bermain batal dengan mengklaim bahwa terlalu lama, jadi, jalankan secara lokal.)
sumber
keysAppend
fungsi Anda, Anda dapat mengatur kapasitaskeys
arraymake([]uint64, 0, len(m))
, yang secara drastis mengubah kinerja fungsi tersebut untuk saya.Kunjungi https://play.golang.org/p/dx6PTtuBXQW
sumber