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

Linda Hamilton
Lepaskan: 2024-11-03 09:53:29
asal
784 orang telah melayarinya

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>
Salin selepas log masuk

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>
Salin selepas log masuk

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>
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan