Dans les génériques Go2, vous pouvez utiliser une interface pour contraindre un type générique, en vous assurant qu'il implémente une méthode spécifique . Cependant, imposer l'implémentation d'une méthode avec un argument de type générique n'était pas autorisé dans la version actuelle.
Présentation d'une solution :
La nouvelle version permet de définir l'interface Lesser et IsLess fonctionner comme :
type Lesser[T any] interface { Less(T) bool } func IsLess[T Lesser[T]](x, y T) bool { return x.Less(y) }
Cette solution impose que T doit être d'un type qui implémente l'interface Lesser, ce qui nécessite une méthode Less prenant un argument de tapez T. En définissant la contrainte T Lesser[T], nous créons une contrainte de type récursive.
Exemple pratique :
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 }
Dans cet exemple, les types personnalisés Apple et Orange remplissent tous deux l'exigence Lesser et peut être transmise à IsLess. Cependant, transmettre un int ou mélanger des types (par exemple, Apple et Orange) entraînera des erreurs de compilation dues à des contraintes de type.
Conclusion :
Cette solution permet des contraintes de type récursives à l'aide d'une interface définie. dans la nouvelle version des génériques Go2, vous permettant d'appliquer des relations complexes entre les types génériques et leurs méthodes.
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!