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
Mary-Kate OlsenOriginal
2024-12-31 01:28:09963Durchsuche

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()
}

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!

Stellungnahme:
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