Maison >développement back-end >Golang >Comment puis-je utiliser des méthodes partagées avec des contraintes de type d'union dans Go Generics ?

Comment puis-je utiliser des méthodes partagées avec des contraintes de type d'union dans Go Generics ?

Barbara Streisand
Barbara Streisandoriginal
2024-12-23 12:30:09122parcourir

How Can I Use Shared Methods with Union Type Constraints in Go Generics?

Contraintes génériques dans Go : utilisation de méthodes partagées pour les types d'union

Dans les génériques Go (v1.18), une contrainte d'union de type vous permet pour définir un ensemble de types pouvant être affectés à un paramètre de type générique. Cependant, l'utilisation d'une méthode partagée pour ces types peut entraîner des erreurs.

Considérez le code suivant :

type A struct {}
type B struct {}

type AB interface {
    *A | *B
}

func (a *A) some() bool {
    return true
}

func (b *B) some() bool {
    return false
}

func some[T AB](x T) bool {
    return x.some()   // <- error
}

L'erreur se produit car le compilateur ne trouve pas la méthode some sur le type d'union AB. . Pour résoudre ce problème, vous devez ajouter la méthode à la contrainte d'interface :

type AB interface {
    *A | *B
    some() bool
}

func some[T AB](x T) bool {
    return x.some()   // works
}

Cela restreint le type générique T aux types qui implémentent à la fois *A et *B, et définit également la méthode some.

Cependant, comme indiqué dans les notes de version de Go 1.18, il s'agit d'une limitation temporaire. Go 1.19 devrait supprimer cette restriction, permettant au compilateur de déduire automatiquement la méthode some à partir du type union.

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