Gestion des contraintes d'attribution de type dans les génériques
L'attribution d'une valeur littérale à un champ struct d'un type générique peut entraîner une erreur « IncompatibleAssign » . Ce problème survient lorsque la contrainte de type inclut des types qui n'appartiennent pas au même « groupe de types », tels que des entiers et des nombres à virgule flottante.
Dans ce contexte spécifique, la déclaration de méthode
func (f *foo[float64]) setValToPi() { f.val = 3.14 // IncompatibleAssign: cannot use 3.14 (untyped float constant) as float64 value in assignment }
tente d'attribuer un littéral à virgule flottante à un champ de type générique foo. Cependant, le paramètre de type T est limité à ~float32 | ~float64 | ~int, ce qui signifie qu'une instance de foo peut être instanciée avec un type entier.
Pour comprendre pourquoi cette erreur se produit, il est important de reconnaître que la déclaration de méthode à elle seule n'instancie pas le type générique. Le paramètre de type float64 entre crochets est simplement un espace réservé pour le type réel utilisé pour instancier la structure foo.
Dans la méthode, la seule information sur le type du champ val est qu'il est contraint à une contrainte, pas nécessairement float64. Le littéral à virgule flottante 3.14 n'est pas typé, ce qui signifie qu'il ne peut pas être attribué en toute sécurité à toutes les instances possibles de foo, en particulier celles avec un type entier.
Pour résoudre ce problème, une approche consiste à utiliser un paramètre générique. type au lieu d'un type fixe au sein de la méthode :
func (f *foo[T]) SetValue(val T) { f.val = val }
Cela permet à la méthode d'accepter des valeurs du type de paramètre générique, garantissant la compatibilité quel que soit le type utilisé pour instancier foo.
Alternativement, d'autres solutions incluent l'utilisation de any/interface{} comme type de champ ou l'exploration de techniques telles que les assertions de type ou les génériques avec des types d'interface.
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!