Saya tahu saya bisa mengulangi peta m
dengan,
for k, v := range m { ... }
dan mencari kunci tetapi apakah ada cara yang lebih efisien untuk menguji keberadaan kunci di peta?
Saya tidak dapat menemukan jawabannya dalam spesifikasi bahasa .
dictionary
go
go-map
grokus
sumber
sumber
Jawaban:
Satu jawaban baris:
Penjelasan:
if
pernyataan dalam Go dapat mencakup kondisi dan pernyataan inisialisasi. Contoh di atas menggunakan keduanya:menginisialisasi dua variabel -
val
akan menerima nilai "foo" dari peta atau "nilai nol" (dalam hal ini string kosong) danok
akan menerima bool yang akan ditetapkantrue
jika "foo" benar-benar ada di petamengevaluasi
ok
, yang akan terjaditrue
jika "foo" ada di petaJika "foo" memang ada di peta, badan
if
pernyataan akan dieksekusi danval
akan menjadi lokal untuk ruang lingkup itu.sumber
var val string = ""
akan tetap sama,val, ok :=
membuat variabel lokal baru dengan nama yang sama yang hanya dapat dilihat di blok itu.if key in dict
.Selain Spesifikasi Bahasa Pemrograman Go , Anda harus membaca Efektif Go . Di bagian peta , kata mereka, antara lain:
sumber
Mencari di daftar email go-nuts dan menemukan solusi yang diposting oleh Peter Froehlich pada 11/15/2009.
Atau, lebih kompak,
Catatan, menggunakan bentuk
if
pernyataan ini, variabelvalue
danok
hanya terlihat di dalamif
kondisi.sumber
_, ok := dict["baz"]; ok
. Bagian_
membuang nilai alih-alih membuat variabel sementara.Jawaban singkat
Contoh
Berikut ini contoh di Go Playground .
Jawaban yang lebih panjang
Per bagian Peta dari Go Efektif :
sumber
Seperti dicatat oleh jawaban lain, solusi umum adalah dengan menggunakan ekspresi indeks dalam penugasan bentuk khusus:
Ini bagus dan bersih. Meskipun memiliki beberapa batasan: itu harus berupa penugasan bentuk khusus. Ekspresi sisi kanan harus hanya ekspresi indeks peta, dan daftar ekspresi tangan kiri harus berisi tepat 2 operan, pertama yang jenis nilai dapat ditugaskan, dan yang kedua dimana
bool
nilai ditugaskan. Nilai pertama dari hasil bentuk khusus ini akan menjadi nilai yang terkait dengan kunci, dan nilai kedua akan memberi tahu apakah sebenarnya ada entri di peta dengan kunci yang diberikan (jika kunci ada di peta). Daftar ekspresi sisi kiri juga dapat berisi pengidentifikasi kosong jika salah satu hasil tidak diperlukan.Penting untuk diketahui bahwa jika nilai peta yang diindeks adalah
nil
atau tidak mengandung kunci, ekspresi indeks dievaluasi ke nilai nol dari jenis nilai peta. Jadi misalnya:Cobalah di Go Playground .
Jadi jika kita tahu bahwa kita tidak menggunakan nilai nol di peta kita, kita bisa mengambil keuntungan dari ini.
Sebagai contoh jika jenis nilai adalah
string
, dan kita tahu kita tidak pernah menyimpan entri di peta di mana nilainya adalah string kosong (nilai nol untukstring
jenis), kita juga dapat menguji apakah kuncinya ada di peta dengan membandingkan non-khusus bentuk (hasil dari) ekspresi indeks ke nilai nol:Output (coba di Go Playground ):
Dalam praktiknya ada banyak kasus di mana kami tidak menyimpan nilai nol di peta, jadi ini bisa digunakan cukup sering. Misalnya antarmuka dan tipe fungsi memiliki nilai nol
nil
, yang sering tidak kami simpan di peta. Jadi menguji apakah kunci di peta dapat dicapai dengan membandingkannyanil
.Menggunakan "teknik" ini memiliki keuntungan lain juga: Anda dapat memeriksa keberadaan beberapa tombol dengan cara yang ringkas (Anda tidak dapat melakukannya dengan bentuk "koma ok" khusus). Lebih lanjut tentang ini: Periksa apakah ada kunci di beberapa peta dalam satu kondisi
Mendapatkan nilai nol dari tipe nilai saat pengindeksan dengan kunci yang tidak ada juga memungkinkan kita untuk menggunakan peta dengan
bool
nilai - nilai sesuai set . Sebagai contoh:Ini menghasilkan (coba di Go Playground ):
Lihat yang terkait: Bagaimana saya bisa membuat array yang berisi string unik?
sumber
T
di dalamvar v, ok T = a[x]
? bukankahok
harus bool?map[bool]bool
danT
adalahbool
, tetapi juga bekerja jika peta adalah tipemap[interface{}]bool
danT
adalahinterface{}
; selain itu juga berfungsi dengan tipe khususbool
sebagai tipe yang mendasari, lihat semua di Go Playground . Jadi karena formulir itu valid dengan beberapa jenis yang digantiT
, itu sebabnya yang umumT
digunakan. Jenisok
dapat berupa apa saja yang dapat diberikan pada siapa yang tidak diberi tagbool
.cara yang lebih baik di sini
sumber
sumber
Lalu, jalankan menjalankan maps.go suatu tempat ada? benarkah tidak ada? Salah
sumber
_, ok = m["somestring"]
seharusnya=_, ok := m["somestring"]
Disebutkan di bawah "Ekspresi indeks" .
sumber
Penugasan dua nilai dapat digunakan untuk tujuan ini. Silakan periksa program sampel saya di bawah ini
sumber