Cara Semak Kehadiran Elemen Secara Umum dalam Slice dalam Go
In Go, menentukan sama ada kepingan mengandungi elemen tertentu boleh menjadi senario biasa. Walau bagaimanapun, tiada kaedah terbina dalam untuk melakukan semakan generik ini merentas jenis kepingan yang berbeza.
Percubaan Gagal dengan Antara Muka{}
Percubaan untuk menggunakan antara muka{ } taip sebagai penyelesaian generik, seperti yang ditunjukkan di bawah, mungkin kelihatan munasabah:
<code class="go">func sliceContains(slice []interface{}, elem interface{}) bool { for _, item := range slice { if item == elem { return true } } return false }</code>
Walau bagaimanapun, membandingkan nilai pelbagai jenis (antara muka{}) boleh membawa kepada hasil yang salah.
Penyelesaian Generik dengan Refleksi
Untuk mencapai penyelesaian yang benar-benar generik, refleksi boleh digunakan. Fungsi berikut menggunakan pantulan untuk mengulangi hirisan dan membandingkan setiap elemen dengan elemen sasaran:
<code class="go">func Contains(slice, elem interface{}) bool { sv := reflect.ValueOf(slice) // Check that slice is actually a slice/array. if sv.Kind() != reflect.Slice && sv.Kind() != reflect.Array { return false } // Iterate the slice for i := 0; i < sv.Len(); i++ { // Compare elem to the current slice element if elem == sv.Index(i).Interface() { return true } } // Nothing found return false }</code>
Penyelesaian ini membolehkan anda melakukan semakan elemen generik pada kepingan apa-apa jenis.
Pertimbangan Prestasi
Walaupun fungsi Mengandungi generik menyediakan fungsi yang diingini, ia datang pada kos prestasi yang ketara. Penandaarasan terhadap fungsi setara bukan generik menghasilkan faktor kelembapan lebih kurang 50x. Oleh itu, adalah penting untuk menilai implikasi prestasi sebelum menggunakan refleksi untuk semakan elemen generik.
Atas ialah kandungan terperinci Bagaimanakah anda menyemak kehadiran elemen dalam kepingan jenis yang berbeza dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!