Maison > développement back-end > Golang > Comment puis-je obtenir des contraintes de type récursives dans Go Generics ?

Comment puis-je obtenir des contraintes de type récursives dans Go Generics ?

Susan Sarandon
Libérer: 2024-12-22 06:57:44
original
517 Les gens l'ont consulté

How Can I Achieve Recursive Type Constraints in Go Generics?

Contrainte de type récursive avec type prédéfini

Dans les génériques Go, il est possible de spécifier des contraintes de type sur les types génériques à l'aide d'interfaces. Cependant, il peut être difficile de définir une contrainte qui nécessite l'implémentation d'une méthode avec un argument de type générique lui-même.

Limitations actuelles du projet

Le projet actuel des génériques Go ne permet pas contraintes de type récursif, rendant impossible l’obtention du comportement souhaité. Par exemple, considérons l'interface suivante :

type Lesser interface {
    Less(rhs Lesser) bool
}
Copier après la connexion

Nous pouvons implémenter cette interface pour un type personnalisé, tel que Int :

type Int int

func (lhs Int) Less(rhs Int) bool {
    return lhs < rhs
}
Copier après la connexion

Cependant, la compilation du code suivant échouera car Int ne satisfait pas l'interface Lesser :

func IsLess[T Lesser](lhs, rhs T) bool {
    return lhs.Less(rhs)
}

func main() {
    IsLess[Int](Int(10), Int(20))
}
Copier après la connexion

Solution utilisant une interface prédéfinie

Une solution de contournement pour cette limitation est pour définir une interface générique qui se référence en tant que paramètre de type :

type Lesser[T any] interface {
    Less(T) bool
}
Copier après la connexion

Cette interface spécifie que tout type qui implémente l'interface Lesser doit avoir une méthode Less qui prend un argument du même type.

Nous pouvons ensuite définir la fonction IsLess à l'aide de cette interface générique :

func IsLess[T Lesser[T]](x, y T) bool {
    return x.Less(y)
}
Copier après la connexion

Maintenant, nous pouvons implémenter des types personnalisés qui remplissent la Lesser contrainte :

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
}
Copier après la connexion

L'utilisation de la fonction IsLess avec ces types personnalisés entraînera un comportement correct :

func main() {
    fmt.Println(IsLess(Apple(10), Apple(20)))   // true
    fmt.Println(IsLess(Orange(30), Orange(15))) // false
}
Copier après la connexion

Cette solution applique efficacement la contrainte de type récursif en nécessitant l'implémentation d'une méthode avec un argument de 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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal