## Bagaimana untuk Memulakan Kepingan Antara Muka dengan Jenis Konkrit dalam Go?

Susan Sarandon
Lepaskan: 2024-10-25 14:01:02
asal
963 orang telah melayarinya

## How to Initialize Slices of Interfaces with Concrete Types in Go?

Permulaan Generik dengan Antara Muka dan 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.

Percubaan Awal dengan Parameter Pelbagai Jenis

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

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.

Menggunakan Casting Eksplisit

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

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.

Menggunakan Fungsi Pembina

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

Fungsi ini menerima fungsi pembina yang mengembalikan tika baharu jenis yang ditentukan. Ini membolehkan permulaan hirisan yang ringkas dan selamat dengan contoh jenis konkrit.

Mengelakkan Nilai Null

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!

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
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!