Rumah >pembangunan bahagian belakang >Golang >Bolehkah Pakej Refleksi Go Mendayakan Pemeriksaan Kehadiran Elemen Generik dalam Slices?

Bolehkah Pakej Refleksi Go Mendayakan Pemeriksaan Kehadiran Elemen Generik dalam Slices?

Linda Hamilton
Linda Hamiltonasal
2024-11-03 09:53:29881semak imbas

Can Go's Reflection Package Enable Generic Element Presence Checks in Slices?

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:

  • Generik: N=100000, 73.023214ms, 730.23214 ns/op
  • Bukan Generik: N=100000, 1.315262ms, 13.15262 ns/op
Bukan Generik: N=100000, 1.315262ms, 13.15262 ns/op

mengandungi fungsi ref. memberikan serba boleh, ia harus digunakan dengan bijak untuk mengelakkan kesesakan prestasi.

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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn