Rumah  >  Artikel  >  pembangunan bahagian belakang  >  ## Bagaimana untuk Memulakan Kepingan Antara Muka dengan Jenis Konkrit dalam Go?

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

Susan Sarandon
Susan Sarandonasal
2024-10-25 14:01:02954semak imbas

## 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>

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>

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>

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!

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