Rumah > pembangunan bahagian belakang > Golang > Bagaimanakah Saya Boleh Mencipta Fungsi Generik Go Yang Menerima Penunjuk kepada Pelaksanaan Antara Muka?

Bagaimanakah Saya Boleh Mencipta Fungsi Generik Go Yang Menerima Penunjuk kepada Pelaksanaan Antara Muka?

Mary-Kate Olsen
Lepaskan: 2024-12-21 05:25:14
asal
176 orang telah melayarinya

How Can I Create a Generic Go Function That Accepts a Pointer to an Interface Implementation?

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

Dan katakan terdapat pelaksanaan A sebagai penunjuk struktur:

type Aimpl struct {}

func (a *Aimpl) SomeMethod() {}
Salin selepas log masuk

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

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

Walau bagaimanapun, ini gagal dengan perkara berikut ralat:

result does not implement interface. It's a pointer to a type, not a type
Salin selepas log masuk

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

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

Kini, kod boleh memanggil Pengendali seperti yang dijangkakan:

Handler(func(a *Aimpl) { fmt.Printf("%#v\n", a) })
Salin selepas log masuk

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

Dan ubah suai fungsi Pengendali sewajarnya:

func Handler[P any, T MyA[P]](callback func(result T)) {
    result := new(P)
    callback(result)
}
Salin selepas log masuk

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!

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