Überlegungen zur Typsicherheit in Generika
In den Generika von Go unterscheidet sich der Typparameter T von der Einschränkungsschnittstelle FooBar. Diese Unterscheidung wirft jedoch eine Frage auf: Wie kann man eine Instanz von T an eine Funktion übergeben, die einen Typ erwartet, der Stringer implementiert (wie es der Fall ist)?
Den Fehler verstehen
Die Fehlermeldung „Variable vom Typ *T kann nicht als Typ-Stringer im zu erledigenden Argument verwendet werden“ deutet darauf hin, dass der Parameter t von blah fälschlicherweise als Typ identifiziert wird, der Stringer implementiert. Allerdings verfügt T nicht von Natur aus über diese Methode.
Lösung des Problems
Um die Konvertierung von t in Stringer zu ermöglichen, sind die folgenden Schritte erforderlich:
Final Code
type FooBar[T foo | bar] interface { *T stringer } func blah[T foo | bar, U FooBar]() { var t T do(U(&t)) } func main() { blah[foo]() }
Erklärung
Wenn nun blah aufgerufen wird, wird eine Variable t vom Typ T als Zeiger deklariert. FooBar[T] schränkt U auf einen Typ ein, der einen Zeiger auf T enthält. Die Konvertierung von &t in U ist gültig und die Methoden von FooBar[T] (einschließlich Stringer) stehen dem Empfänger t zur Verfügung.
Hinweis:
Die Verwendung von Typparametern für FooBar ermöglicht die Übergabe von Argumenten und macht Zwischentricks überflüssig. Beispielsweise könnten Sie blah ändern in:
func blah[T FooBar](t T) { do(t) }
Und es mit blah(&foo{}) aufrufen.
Das obige ist der detaillierte Inhalt vonWie kann ich den Fehler „Variable vom Typ *T kann nicht als Typstringer verwendet werden' in Go Generics beheben?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!