Rekursive Typeinschränkung mit vordefiniertem Typ
In Go-Generika ist es möglich, Typeinschränkungen für generische Typen mithilfe von Schnittstellen anzugeben. Es kann jedoch schwierig sein, eine Einschränkung zu definieren, die die Implementierung einer Methode mit einem Argument des generischen Typs selbst erfordert.
Der aktuelle Entwurf von Go-Generika lässt dies nicht zu rekursive Typbeschränkungen, die es unmöglich machen, das gewünschte Verhalten zu erreichen. Betrachten Sie beispielsweise die folgende Schnittstelle:
type Lesser interface { Less(rhs Lesser) bool }
Wir können diese Schnittstelle für einen benutzerdefinierten Typ wie Int implementieren:
type Int int func (lhs Int) Less(rhs Int) bool { return lhs < rhs }
Der folgende Code kann jedoch nicht kompiliert werden, weil Int erfüllt die Lesser-Schnittstelle nicht:
func IsLess[T Lesser](lhs, rhs T) bool { return lhs.Less(rhs) } func main() { IsLess[Int](Int(10), Int(20)) }
Eine Problemumgehung für diese Einschränkung ist So definieren Sie eine generische Schnittstelle, die sich selbst als Typparameter referenziert:
type Lesser[T any] interface { Less(T) bool }
Diese Schnittstelle gibt an, dass jeder Typ, der die Lesser-Schnittstelle implementiert, über eine Less-Methode verfügen muss, die ein Argument desselben Typs akzeptiert.
Wir können dann die IsLess-Funktion mithilfe dieser generischen Schnittstelle definieren:
func IsLess[T Lesser[T]](x, y T) bool { return x.Less(y) }
Jetzt können wir benutzerdefinierte Typen implementieren, die die Lesser-Funktion erfüllen Einschränkung:
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 }
Die Verwendung der IsLess-Funktion mit diesen benutzerdefinierten Typen führt zu korrektem Verhalten:
func main() { fmt.Println(IsLess(Apple(10), Apple(20))) // true fmt.Println(IsLess(Orange(30), Orange(15))) // false }
Diese Lösung erzwingt effektiv die rekursive Typbeschränkung, indem sie die Implementierung einer Methode mit erfordert ein Argument des generischen Typs.
Das obige ist der detaillierte Inhalt vonWie kann ich rekursive Typbeschränkungen in Go Generics erreichen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!