Rumah  >  Artikel  >  pembangunan bahagian belakang  >  **Bagaimana untuk Mengekalkan Hubungan Antara Muka-Pelaksana Apabila Menggunakan Generik dalam Go for Slice Initialization?**

**Bagaimana untuk Mengekalkan Hubungan Antara Muka-Pelaksana Apabila Menggunakan Generik dalam Go for Slice Initialization?**

DDD
DDDasal
2024-10-25 17:22:02474semak imbas

**How to Preserve Interface-Implementor Relationships When Using Generics in Go for Slice Initialization?**

Keselarasan Antara Muka/Pelaksanaan dalam Generik Golang

Pertimbangkan tugas mencipta fungsi generik untuk mengisi kepingan dengan nilai yang dimulakan. Walaupun ini kelihatan mudah, cabaran timbul apabila cuba menggunakan kepingan antara muka dan menentukan jenis konkrit dalam fungsi.

Dalam Go 1.18, mengekang kedua-dua X dan Y kerana mana-mana jenis dalam fungsi generik Isian membawa kepada kerugian sebarang hubungan antara antara muka dan pelaksananya. Ini menghalang penetapan tika Y untuk menghiris[i] dalam fungsi.

Untuk mengatasinya, penegasan eksplisit boleh digunakan:

<code class="go">func Fill[X, Y any](slice []X) {
    for i := range slice {
        slice[i] = any(*new(Y)).(X)
    }
}</code>

Walau bagaimanapun, pendekatan ini panik apabila Y tidak melaksanakan X. Selain itu, menggunakan jenis penuding untuk Y mengakibatkan kehilangan maklumat tentang jenis asas dan nilai garis dasar sifar.

Untuk menangani isu ini, adalah disyorkan untuk menggunakan fungsi pembina dan bukannya parameter jenis kedua:

<code class="go">func main() {
    xs := make([]sync.Locker, 10)
    Fill(xs, func() sync.Locker { return &sync.Mutex{} })
}

func Fill[X any](slice []X, f func() X) {
    for i := range slice {
        slice[i] = f()
    }
}</code>

Pendekatan ini mengisi kepingan dengan berkesan dengan nilai yang dimulakan yang dicipta oleh fungsi pembina, memberikan penyelesaian yang lebih mantap dan fleksibel kepada masalah.

Atas ialah kandungan terperinci **Bagaimana untuk Mengekalkan Hubungan Antara Muka-Pelaksana Apabila Menggunakan Generik dalam Go for Slice Initialization?**. 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