Maison >développement back-end >Golang >Comment puis-je définir des contraintes de type récursives dans les génériques Go à l'aide d'interfaces personnalisées ?

Comment puis-je définir des contraintes de type récursives dans les génériques Go à l'aide d'interfaces personnalisées ?

Barbara Streisand
Barbara Streisandoriginal
2025-01-04 09:28:341049parcourir

How Can I Define Recursive Type Constraints in Go Generics Using Custom Interfaces?

Définition de contraintes de type récursives avec des interfaces personnalisées

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.

Scénario de problème

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

Solution

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].

Exemple d'utilisation

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!

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