Penuding Generik kepada Pelaksanaan Antara Muka
Dalam Go, mentakrifkan fungsi generik yang menerima penuding kepada antara muka boleh menjadi mencabar. Pertimbangkan antara muka A dengan SomeMethod():
type A interface { SomeMethod() }
Dan katakan terdapat pelaksanaan A sebagai penunjuk struktur:
type Aimpl struct {} func (a *Aimpl) SomeMethod() {}
Untuk mencipta Pengendali fungsi generik yang mengambil fungsi dengan parameter A, adalah wajar untuk mentakrifkan:
func Handler[T A](callback func(result T)) { // Essentially what I'd like to do is result := &Aimpl{} (or whatever T is) callback(result) }
Walau bagaimanapun, terdapat beberapa kekangan untuk dipertimbangkan.
Cuba dengan mana-mana Parameter Jenis
Pada mulanya, nampaknya mungkin untuk mentakrifkan antara muka dengan parameter jenis untuk membenarkan pelaksanaan penunjuk:
type MyA[T any] interface{ A *T }
Walau bagaimanapun, ini gagal dengan perkara berikut ralat:
result does not implement interface. It's a pointer to a type, not a type
Penyelesaian: Type Parameterized Interface
Untuk mengatasinya, antara muka boleh diisytiharkan dengan parameter jenis yang memerlukan jenis pelaksana menjadi penunjuk kepada parameter jenisnya:
type A[P any] interface { SomeMethod() *P }
Dengan antara muka ini, fungsi Pengendali boleh diubah suai:
func Handler[P any, T A[P]](callback func(result T)) { result := new(P) callback(result) }
Kini, kod boleh memanggil Pengendali seperti yang dijangkakan:
Handler(func(a *Aimpl) { fmt.Printf("%#v\n", a) })
Alternatif dengan Pembalut Antara Muka
Jika takrifan A tidak boleh diubah suai, pendekatan alternatif ialah membungkusnya dalam antara muka tersuai:
type MyA[P any] interface { A *P }
Dan ubah suai fungsi Pengendali sewajarnya:
func Handler[P any, T MyA[P]](callback func(result T)) { result := new(P) callback(result) }
Kedua-dua penyelesaian membenarkan penciptaan fungsi generik yang menerima penunjuk kepada pelaksanaan antara muka.
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Mencipta Fungsi Generik Go Yang Menerima Penunjuk kepada Pelaksanaan Antara Muka?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!