Bolehkah Kod Generik Dilaksanakan untuk Menentukan Kehadiran Elemen dalam Go Slices?
Dalam Go, menentukan sama ada hirisan mengandungi elemen tertentu ialah operasi biasa. Walau bagaimanapun, untuk setiap jenis kepingan baharu, melaksanakan logik ini boleh kelihatan membosankan.
Satu percubaan penyelesaian melibatkan penggunaan antara muka{} hirisan, seperti yang dilihat dalam coretan kod:
<code class="go">func sliceContains(slice []interface{}, elem interface{}) bool { for _, item := range slice { if item == elem { return true } } return false }</code>
Walau bagaimanapun, pendekatan ini dihalang oleh sifat antara muka{} dan keperluan untuk melaksanakannya bagi setiap jenis kepingan baharu.
Mujurlah, pakej refleksi Go menyediakan penyelesaian generik:
<code class="go">func Contains(slice, elem interface{}) bool { sv := reflect.ValueOf(slice) // Check slice type. if sv.Kind() != reflect.Slice && sv.Kind() != reflect.Array { return false } // Iterate slice and compare elements. for i := 0; i < sv.Len(); i++ { if elem == sv.Index(i).Interface() { return true } } // Element not found. return false }</code>
Fungsi ini mengambil dua parameter: kepingan dan elemen untuk dicari. Ia menggunakan pantulan untuk menentukan sama ada hirisan itu adalah hirisan atau tatasusunan, kemudian mengulangi elemennya menggunakan kaedah ValueOf() dan Index().
Walaupun pendekatan generik ini mudah, ia datang pada kos prestasi. Penanda aras menunjukkan bahawa ia boleh menjadi 50-60 kali lebih perlahan daripada versi bukan generik, seperti yang dilihat di bawah:
<code class="go">func ContainsNonGeneic(slice []int, elem int) bool { for _, i := range slice { if i == elem { return true } } return false }</code>
Keputusan Penanda Aras:
Atas ialah kandungan terperinci Bolehkah Pakej Refleksi Go Mendayakan Pemeriksaan Kehadiran Elemen Generik dalam Slices?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!