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 ?
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!