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
Libérer: 2025-01-04 09:28:34
original
1014 Les gens l'ont consulté

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

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

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

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

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!

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