In Go-Generika können Typeinschränkungen mithilfe von Schnittstellen definiert werden. Der Standardentwurf lässt jedoch keine rekursiven Typeinschränkungen zu, bei denen die Methode eines Typs ein Argument des generischen Typs hat.
Betrachten Sie den folgenden Code, der eine Schnittstelle definiert Kleiner und eine Funktion IsLess:
type Lesser interface { Less(rhs Lesser) bool } func IsLess[T Lesser](lhs, rhs T) bool { return lhs.Less(rhs) }
Das Ausführen dieses Codes führt zu einem Fehler:
Int does not satisfy Lesser: wrong method signature got func (Int).Less(rhs Int) bool want func (Lesser).Less(rhs Lesser) bool
Um dieses Problem zu beheben, können wir Folgendes definieren Lesser-Schnittstelle und das IsLess Funktion wie folgt:
type Lesser[T any] interface { Less(T) bool } func IsLess[T Lesser[T]](x, y T) bool { return x.Less(y) }
In dieser Definition nimmt die Lesser-Schnittstelle einen Typparameter T und deklariert eine Methode Less, die akzeptiert ein Argument vom Typ T. Die Funktion IsLess schränkt den generischen Typ T ein, um die Schnittstelle Lesser[T] zu implementieren.
Hier ist ein Beispiel für die Verwendung dieser Lösung:
type Apple int func (a Apple) Less(other Apple) bool { return a < other } func main() { fmt.Println(IsLess(Apple(10), Apple(20))) // true fmt.Println(IsLess(Apple(20), Orange(30))) // compilation error: type mismatch }
In In diesem Beispiel erfüllt der Typ Apple die Schnittstelle Lesser[Apple], da seine Methode Less ein Argument vom Typ Apple akzeptiert. Die Funktion IsLess kann dann verwendet werden, um zwei Apple-Werte zu vergleichen.
Dieser Ansatz ermöglicht rekursive Typbeschränkungen, sodass Sie erzwingen können, dass die Methode eines Typs ein Argument hat vom generischen Typ.
Das obige ist der detaillierte Inhalt vonWie kann ich rekursive Typbeschränkungen in Go Generics mithilfe benutzerdefinierter Schnittstellen definieren?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!