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

DDD
Lepaskan: 2024-10-25 17:22:02
asal
488 orang telah melayarinya

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

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

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!

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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!