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
Susan Sarandonoriginal
2024-12-22 06:57:44558parcourir

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
}

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
}

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))
}

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
}

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)
}

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
}

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
}

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!

Déclaration:
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