Rumah >pembangunan bahagian belakang >Golang >## Bagaimana untuk Memulakan Kepingan Antara Muka dengan Jenis Konkrit dalam Go?
Apabila menulis fungsi generik dalam Go, ia boleh memberi manfaat untuk turut menerima jenis konkrit. Walau bagaimanapun, ini menimbulkan cabaran apabila cuba memulakan serpihan antara muka dengan kejadian baharu jenis khusus tersebut.
Satu pendekatan mungkin kelihatan logik: mentakrifkan dua jenis parameter, satu untuk jenis unsur hirisan (X) dan satu untuk jenis konkrit (Y) untuk dijadikan instantiat. Walau bagaimanapun, pendekatan ini gagal apabila cuba memberikan contoh Y kepada unsur jenis X.
<code class="go">func Fill[X, Y any](slice []X){ for i := range slice { slice[i] = new(Y) // not work! } }</code>
Isu ini timbul kerana pengkompil kehilangan hubungan antara antara muka X dan pelaksanaannya Y. Kedua-dua X dan Y dianggap sebagai mana-mana jenis yang berbeza.
Untuk menangani perkara ini, seseorang boleh menggunakan operasi tuangan eksplisit dalam fungsi:
<code class="go">func Fill[X, Y any](slice []X) { for i := range slice { slice[i] = any(*new(Y)).(X) } }</code>
Walau bagaimanapun, ini pendekatan mencetuskan panik jika Y tidak melaksanakan X, yang berlaku dalam senario seperti cuba menetapkan *sync.Mutex (jenis penunjuk) untuk menyegerak.Locker.
Penyelesaian yang lebih mantap dan selamat jenis melibatkan penggunaan fungsi pembina:
<code class="go">func Fill[X any](slice []X, f func() X) { for i := range slice { slice[i] = f() } }</code>
Fungsi ini menerima fungsi pembina yang mengembalikan tika baharu jenis yang ditentukan. Ini membolehkan permulaan hirisan yang ringkas dan selamat dengan contoh jenis konkrit.
Dalam kes di mana jenis konkrit bertujuan untuk dijadikan instantiated dengan jenis penunjuk, adalah penting untuk diperhatikan yang baru(Y) akan menghasilkan nilai sifar. Untuk memintas perkara ini, seseorang boleh melaraskan fungsi pembina untuk mengembalikan nilai penunjuk yang betul, seperti func() X { return &sync.Mutex{} }.
Atas ialah kandungan terperinci ## Bagaimana untuk Memulakan Kepingan Antara Muka dengan Jenis Konkrit dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!