In Go2-Generika können Sie eine Schnittstelle verwenden, um einen generischen Typ einzuschränken und sicherzustellen, dass er eine bestimmte Methode implementiert . Allerdings war es im aktuellen Entwurf nicht erlaubt, die Implementierung einer Methode mit einem Argument des generischen Typs zu erzwingen.
Einführung einer Lösung:
Der neue Entwurf ermöglicht die Definition der Lesser-Schnittstelle und von IsLess Funktion als:
type Lesser[T any] interface { Less(T) bool } func IsLess[T Lesser[T]](x, y T) bool { return x.Less(y) }
Diese Lösung erzwingt, dass T von einem Typ sein muss, der die Lesser-Schnittstelle implementiert, was eine Less-Methode erfordert, die an übernimmt Argument vom Typ T. Durch die Definition der Einschränkung T Lesser[T] erstellen wir eine rekursive Typeinschränkung.
Praktisches Beispiel:
type Apple int func (a Apple) Less(other Apple) bool { return a < other } type Orange int func (o Orange) Less(other Orange) bool { return o < other } func main() { fmt.Println(IsLess(Apple(10), Apple(20))) // true fmt.Println(IsLess(Orange(30), Orange(15))) // false }
In diesem Beispiel die benutzerdefinierten Typen Apple und Orange beide erfüllen die Lesser-Anforderung und können an IsLess übergeben werden. Die Übergabe eines int oder das Mischen von Typen (z. B. Apple und Orange) führt jedoch aufgrund von Typeinschränkungen zu Kompilierungsfehlern.
Schlussfolgerung:
Diese Lösung ermöglicht rekursive Typeinschränkungen mithilfe einer definierten Schnittstelle im neuen Go2-Generika-Entwurf, mit dem Sie komplexe Beziehungen zwischen generischen Typen und ihren Methoden erzwingen können.
Das obige ist der detaillierte Inhalt vonWie kann ich eine rekursive Typbeschränkung in Go 2 Generics definieren?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!