Dans les génériques Go, les contraintes de type peuvent être définies à l'aide d'interfaces. Cependant, le projet standard ne permet pas les contraintes de type récursives, où la méthode d'un type a un argument de type générique.
Considérez le code suivant qui définit une interface Moindre et une fonction IsLess :
type Lesser interface { Less(rhs Lesser) bool } func IsLess[T Lesser](lhs, rhs T) bool { return lhs.Less(rhs) }
L'exécution de ce code entraîne une erreur :
Int does not satisfy Lesser: wrong method signature got func (Int).Less(rhs Int) bool want func (Lesser).Less(rhs Lesser) bool
Pour résoudre ce problème, nous pouvons définir le Lesser et la fonction IsLess comme suit :
type Lesser[T any] interface { Less(T) bool } func IsLess[T Lesser[T]](x, y T) bool { return x.Less(y) }
Dans cette définition, l'interface Lesser prend un paramètre de type T et déclare une méthode Less qui accepte un argument de type T. La fonction IsLess contraint le type générique T à implémenter l'interface Lesser[T].
Ici est un exemple d'utilisation de cette solution :
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 }
Dans cet exemple, le Le type Apple satisfait à l'interface Lesser[Apple] car sa méthode Less accepte un argument de type Apple. La fonction IsLess peut ensuite être utilisée pour comparer deux valeurs Apple.
Cette approche permet des contraintes de type récursives, vous permettant d'imposer qu'une méthode de type ait un argument du type générique.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!