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