Méthodes d'appel 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 entre 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 due au fait que la contrainte d'union de type *A | *B ne garantit pas l'existence d'une méthode 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
Cela 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 unions de type uniquement. 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.
Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.
Copyright© 2022 湘ICP备2022001581号-3