Maison >développement back-end >Golang >Les contraintes d'union de Go Generics peuvent-elles appeler des méthodes partagées sans déclaration d'interface explicite ?

Les contraintes d'union de Go Generics peuvent-elles appeler des méthodes partagées sans déclaration d'interface explicite ?

Linda Hamilton
Linda Hamiltonoriginal
2024-12-22 16:34:13597parcourir

Can Go Generics' Union Constraints Call Shared Methods Without Explicit Interface Declaration?

Appel de méthodes sur les contraintes d'union dans les génériques Go

Dans les génériques Go (v1.18), vous pouvez rencontrer une contrainte d'union de type qui limite le type de paramètre aux types implémentant une interface unifiée. Cependant, l'incapacité d'appeler des méthodes partagées parmi les types contraints soulève des inquiétudes quant à l'utilité de telles contraintes.

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() } // Compiler error

L'erreur du compilateur "x.some undefined" est dû au fait que la contrainte d'union de type *A | *B ne garantit pas l'existence d'une méthode à la fois sur *A et *B.

Pour résoudre ce problème, vous pouvez 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

Ceci restreint T aux types qui implémentent à la fois *A ou *B et déclarent la méthode some.

Cependant, cette solution est considérée comme une solution de contournement pour ce qui devrait idéalement fonctionner avec les seules unions de types. Go 1.18 a actuellement des limitations dans lesquelles le compilateur prend en charge l'appel d'une méthode sur une valeur de paramètre de type P uniquement si la méthode m est explicitement déclarée par l'interface de contrainte de P. Malgré les spécifications du langage indiquant que l'ensemble de méthodes d'une interface est l'intersection des ensembles de méthodes de chaque type dans l'ensemble de types de l'interface. Ce problème devrait être résolu dans Go 1.19.

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