Rumah >pembangunan bahagian belakang >Golang >Bagaimana Mengendalikan Fungsi Generik dengan Penunjuk Pelaksana Antara Muka dalam Go?

Bagaimana Mengendalikan Fungsi Generik dengan Penunjuk Pelaksana Antara Muka dalam Go?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-12-31 01:28:09962semak imbas

How to Handle Generic Functions with Interface-Implementing Pointers in Go?

Jenis Generik untuk Penunjuk Pelaksanaan Antara Muka

Dalam Go, mencipta fungsi generik yang mengambil fungsi dengan parameter antara muka boleh mencabar apabila pelaksanaan antara muka itu adalah penunjuk kepada struct.

Pertimbangkan perkara berikut antara muka:

type A interface {
  SomeMethod()
}

Kami mempunyai pelaksanaan antara muka ini sebagai penunjuk struktur:

type Aimpl struct {}

func (a *Aimpl) SomeMethod() {}

Kami ingin menentukan fungsi generik yang mengambil fungsi dengan parameter A:

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, ralat timbul kerana keputusan tidak melaksanakan antara muka; ia adalah penunjuk kepada jenis, bukan jenis itu sendiri.

Penyelesaian 1: Antara Muka dengan Parameter Jenis

Untuk menyelesaikan masalah ini, kami boleh mengisytiharkan antara muka dengan parameter jenis , memerlukan jenis yang melaksanakannya menjadi penunjuk kepada parameter jenisnya:

type A[P any] interface {
    SomeMethod()
    *P
}

Dengan pengubahsuaian ini, tandatangan pengendali perlu dilaraskan:

func Handler[P any, T A[P]](callback func(result T)) {
    result := new(P)
    callback(result)
}

Penyelesaian 2: Antara Muka Pembungkus

Jika mengubah suai takrifan A bukan satu pilihan, kita boleh mencipta antara muka pembungkus :

type MyA[P any] interface {
    A
    *P
}

Dan ubah suai tandatangan pengendali sewajarnya:

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

Atas ialah kandungan terperinci Bagaimana Mengendalikan Fungsi Generik dengan Penunjuk Pelaksana 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