Heim >Backend-Entwicklung >Golang >Wie konvertiert man einen generischen Typzeiger sicher in eine bestimmte Schnittstelle in Go?

Wie konvertiert man einen generischen Typzeiger sicher in eine bestimmte Schnittstelle in Go?

Barbara Streisand
Barbara StreisandOriginal
2024-12-11 16:57:22554Durchsuche

How to Safely Convert a Generic Type Pointer to a Specific Interface in Go?

Generischer Typparameter kann nicht in spezifischen Typ konvertiert werden

In Go ist es bei der Verwendung von Generika wichtig, die Beziehung zwischen generischen Typparametern und zu verstehen ihre Zwänge. In diesem Fall ergibt sich das Problem aus dem Versuch, einen Zeiger auf einen generischen Typparameter (*T) als Argument an eine Funktion zu übergeben, die eine bestimmte Schnittstelle (Stringer) erwartet.

Die Fehlermeldung erklärt, dass *T ist ein Zeiger auf einen Typparameter, implementiert jedoch nicht die Stringer-Schnittstelle. Dies liegt daran, dass die Einschränkungen von T (FooBar) und der Stringer-Schnittstelle nicht inhärent miteinander verbunden sind. Um dieses Problem zu lösen, muss eine Beziehung zwischen den beiden hergestellt werden.

Lösung 1: Typsicherheit bestätigen (unsicher)

Eine Lösung besteht darin, zu behaupten, dass *T ist ein Stringer mit any(). Dies ermöglicht es Ihnen, den Zeiger als Argument zu übergeben, aber es beeinträchtigt die Typsicherheit und könnte zu Laufzeitpaniken führen.

func blah[T FooBar]() {
    t := new(T)
    do(any(t).(stringer))
}

Lösung 2: Parametrisieren von FooBar (Typsicher)

Eine andere Lösung besteht darin, die FooBar-Schnittstelle mit dem generischen Typ T zu parametrisieren und sicherzustellen, dass der Typparameter von FooBar und der Typparameter, den Sie an blah übergeben, übereinstimmen. Dieser Ansatz bewahrt die Typsicherheit und ermöglicht die Übergabe von Zeigern auf bestimmte Typen, die die Stringer-Schnittstelle implementieren.

type FooBar[T foo | bar] interface {
    *T
    stringer
}

func blah[T foo | bar, U FooBar[T]]() {
    var t T
    do(U(&t))
}

Erklärung:

  • Die Einschränkungen von T sind jetzt foo oder bar, und FooBar ist mit T parametrisiert.
  • Sie können einen Zeiger auf einen bestimmten Typ erstellen (z. B. *foo) und übergeben Sie es an blah, wodurch FooBar mit dem entsprechenden Typ instanziiert wird.
  • Die Konvertierung U(&t) ist jetzt gültig, da U und der Zeiger auf T denselben Typsatz haben.

Mit dieser Lösung können Sie Instanzen bestimmter Typen übergeben, die die Stringer-Schnittstelle implementieren, und die Typsicherheit während der Instanziierung gewährleisten.

Das obige ist der detaillierte Inhalt vonWie konvertiert man einen generischen Typzeiger sicher in eine bestimmte Schnittstelle in Go?. 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