Verstehen des Fehlers „Variable vom Typ *T kann nicht als Typzeichenfolge im Argument verwendet werden“ in Go Generics
Im bereitgestellten Codeausschnitt Sie versuchen, generisch eine Funktion aufzurufen, die einen Parameter vom Typ stringer erwartet, aber Sie übergeben einen Zeiger auf einen Typparameter T stattdessen.
Der Go-Compiler löst einen Fehler aus, weil:
-
Typidentität und Parameter: T ist nicht von Natur aus äquivalent zu seiner Einschränkung FooBar. Daher ist *T nicht dasselbe wie *FooBar oder *bar.
-
Fehlende Methode: Die Stringer-Schnittstelle erfordert eine Methode namens a(). Derzeit implementieren Ihre foo- und bar-Typen diese Methode auf Zeigerempfängern, aber *T verfügt nicht von Natur aus über diese Methode.
Behebung des Problems
Es gibt sie Zwei Hauptansätze zur Lösung dieses Problems:
1. Stellen Sie Typsicherheit mit Typzusicherung sicher (weniger optimal)
- Stellen Sie sicher, dass *T einen Stringer mithilfe von any(t).(stringer) innerhalb der do-Funktion implementiert.
- Dieser Ansatz kann zu Panik führen, wenn T Stringer nicht tatsächlich implementiert.
2. Einschränkung neu definieren und Generics anpassen (bevorzugt)
- Stringer als Einschränkung zur FooBar-Schnittstelle hinzufügen.
- Verwenden Sie Zeigerempfänger für die Typen foo und bar, um sie an der Einschränkung auszurichten .
- Führen Sie einen zweiten Typparameter ein, der die Einschränkung innerhalb der FooBar angibt Schnittstelle.
- Übergeben Sie eine Instanz des eingeschränkten Typs als Argument an blah.
Überarbeiteter Code:
type FooBar[T foo | bar] interface {
*T
stringer
}
func blah[T foo | bar, U FooBar[T]]() {
var t T
do(U(&t))
}
func main() {
blah[foo]()
}
Nach dem Login kopieren
In diesem überarbeiteter Code:
- Die FooBar-Schnittstelle enthält Stringer als Einschränkung.
- Die Typen foo und bar haben Zeigerempfänger für ihre a()-Methoden.
- U wird durch FooBar[T] eingeschränkt, wodurch sichergestellt wird, dass es sowohl die FooBar- als auch die Stringer-Einschränkungen erfüllt.
- blah benötigt ein Argument vom Typ U, das eine Instanz der eingeschränkten FooBar-Schnittstelle ist.
Das obige ist der detaillierte Inhalt vonWarum kann ich in Go Generics keine Variable vom Typ „*T' als „Stringer' verwenden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!