Heim > Backend-Entwicklung > Golang > Wie kann ich eine generische Go-Funktion erstellen, die einen Zeiger auf eine Schnittstellenimplementierung akzeptiert?

Wie kann ich eine generische Go-Funktion erstellen, die einen Zeiger auf eine Schnittstellenimplementierung akzeptiert?

Mary-Kate Olsen
Freigeben: 2024-12-21 05:25:14
Original
176 Leute haben es durchsucht

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

Generischer Zeiger auf Schnittstellenimplementierung

In Go kann die Definition einer generischen Funktion, die einen Zeiger auf eine Schnittstelle akzeptiert, eine Herausforderung sein. Betrachten Sie eine Schnittstelle A mit einer SomeMethod():

type A interface {
  SomeMethod()
}
Nach dem Login kopieren

Und nehmen wir an, es gibt eine Implementierung von A als Strukturzeiger:

type Aimpl struct {}

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

Um einen generischen Funktionshandler zu erstellen, der eine Funktion übernimmt mit einem A-Parameter wäre es wünschenswert zu definieren:

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

Es gibt jedoch einige Einschränkungen Bedenken Sie.

Versuch mit einem beliebigen Typparameter

Zunächst scheint es möglich zu sein, eine Schnittstelle mit einem Typparameter zu definieren, um Zeigerimplementierungen zu ermöglichen:

type MyA[T any] interface{
  A
  *T
}
Nach dem Login kopieren

Dies schlägt jedoch mit dem folgenden Fehler fehl:

result does not implement interface. It's a pointer to a type, not a type
Nach dem Login kopieren

Lösung: Typ parametrisiert Schnittstelle

Um dies zu umgehen, kann die Schnittstelle mit einem Typparameter deklariert werden, der erfordert, dass der implementierende Typ ein Zeiger auf seinen Typparameter ist:

type A[P any] interface {
    SomeMethod()
    *P
}
Nach dem Login kopieren

Mit dieser Schnittstelle Die Handler-Funktion kann geändert werden:

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

Jetzt kann der Code Handler als aufrufen erwartet:

Handler(func(a *Aimpl) { fmt.Printf("%#v\n", a) })
Nach dem Login kopieren

Alternative mit Interface Wrapper

Wenn die Definition von A nicht geändert werden kann, besteht ein alternativer Ansatz darin, sie in eine benutzerdefinierte Schnittstelle zu packen:

type MyA[P any] interface {
    A
    *P
}
Nach dem Login kopieren

Und ändern Sie die Handler-Funktion entsprechend:

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

Beide Lösungen ermöglichen die Erstellung generischer Funktionen Akzeptieren Sie Zeiger auf Schnittstellenimplementierungen.

Das obige ist der detaillierte Inhalt vonWie kann ich eine generische Go-Funktion erstellen, die einen Zeiger auf eine Schnittstellenimplementierung akzeptiert?. 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