Heim > Backend-Entwicklung > Golang > Wie gehe ich mit generischen Funktionen mit schnittstellenimplementierenden Zeigern in Go um?

Wie gehe ich mit generischen Funktionen mit schnittstellenimplementierenden Zeigern in Go um?

Mary-Kate Olsen
Freigeben: 2024-12-31 01:28:09
Original
963 Leute haben es durchsucht

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

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()
}
Nach dem Login kopieren

Wir haben eine Implementierung dieser Schnittstelle als Strukturzeiger:

type Aimpl struct {}

func (a *Aimpl) SomeMethod() {}
Nach dem Login kopieren

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)
}
Nach dem Login kopieren

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
}
Nach dem Login kopieren

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)
}
Nach dem Login kopieren

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
}
Nach dem Login kopieren

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)
}
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage