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!