Rumah >pembangunan bahagian belakang >Golang >Bagaimana untuk Mencipta Jenis Generik untuk Penunjuk Melaksanakan Antara Muka dalam Go?

Bagaimana untuk Mencipta Jenis Generik untuk Penunjuk Melaksanakan Antara Muka dalam Go?

Linda Hamilton
Linda Hamiltonasal
2024-12-29 20:40:18421semak imbas

How to Create a Generic Type for a Pointer Implementing an Interface in Go?

Jenis Generik untuk Penunjuk Melaksanakan Antara Muka

Apabila bekerja dengan antara muka dalam Go, mungkin perlu menghantar penuding kepada struct yang melaksanakan antara muka. Ini boleh menjadi mencabar apabila mentakrifkan fungsi generik.

Soalan:

Bagaimanakah saya boleh mencipta jenis generik untuk penunjuk yang melaksanakan antara muka?

Jawapan:

Pilihan 1: Ubah suai Definisi Antara Muka

  1. Isytiharkan antara muka dengan parameter jenis untuk menentukan bahawa jenis pelaksanaannya mestilah penunjuk kepada parameter jenisnya:
type A[P any] interface {
    SomeMethod()
    *P
}
  1. Ubah suai pengendali tandatangan:
func Handler[P any, T A[P]](callback func(result T)) {
    result := new(P)
    callback(result)
}

Pilihan 2: Balut Antara Muka (Jika Mengubah Takrifan Tidak Mungkin)

  1. Buat antara muka pembalut yang membenamkan antara muka asal dan menambah penunjuk kepada jenisnya parameter:
type MyA[P any] interface {
    A
    *P
}
  1. Ubah suai tandatangan pengendali untuk menerima antara muka yang dibalut:
func Handler[P any, T MyA[P]](callback func(result T)) {
    result := new(P)
    callback(result)
}

Penggunaan:

Kedua-dua pilihan membenarkan menghantar penunjuk kepada struct yang melaksanakan antara muka A kepada fungsi generik Pengendali. Contohnya:

type Aimpl struct {}

func (a *Aimpl) SomeMethod() {}

func main() {
    Handler(func(a *Aimpl) { fmt.Printf("%#v\n", a) })
}

Atas ialah kandungan terperinci Bagaimana untuk Mencipta Jenis Generik untuk Penunjuk Melaksanakan Antara Muka 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