Generischer Typ für schnittstellenimplementierenden Zeiger
In Go kann das Erstellen einer generischen Funktion, die eine Funktion mit einem Schnittstellenparameter aufnimmt, eine Herausforderung sein wenn die Implementierung dieser Schnittstelle ein Zeiger auf eine Struktur ist.
Bedenken Sie Folgendes Schnittstelle:
type A interface { SomeMethod() }
Wir haben eine Implementierung dieser Schnittstelle als Strukturzeiger:
type Aimpl struct {} func (a *Aimpl) SomeMethod() {}
Wir wollen eine generische Funktion definieren, die eine Funktion mit einem A-Parameter aufnimmt:
func Handler[T A](callback func(result T)) { // Essentially what I'd like to do is result := &Aimpl{} (or whatever T is) callback(result) }
Der Fehler tritt jedoch auf, weil result die Schnittstelle nicht implementiert; Es ist ein Zeiger auf einen Typ, nicht auf den Typ selbst.
Lösung 1: Schnittstelle mit Typparameter
Um dieses Problem zu beheben, können wir die Schnittstelle mit einem Typparameter deklarieren , was erfordert, dass der Typ, der ihn implementiert, ein Zeiger auf seinen Typparameter ist:
type A[P any] interface { SomeMethod() *P }
Mit dieser Änderung muss die Signatur des Handlers sein angepasst:
func Handler[P any, T A[P]](callback func(result T)) { result := new(P) callback(result) }
Lösung 2: Wrapper-Schnittstelle
Wenn das Ändern der Definition von A keine Option ist, können wir eine Wrapper-Schnittstelle erstellen:
type MyA[P any] interface { A *P }
Und ändern Sie die Signatur des Hundeführers entsprechend:
func Handler[P any, T MyA[P]](callback func(result T)) { result := new(P) callback(result) }
Das obige ist der detaillierte Inhalt vonWie gehe ich mit generischen Funktionen mit schnittstellenimplementierenden Zeigern in Go um?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!