Types contraints comme arguments de fonction dans les génériques Go 1.18
Les génériques de Go 1.18 offrent de puissantes contraintes de type, permettant aux développeurs de définir des types personnalisés avec comportement spécifique. Cependant, l'utilisation de ces types contraints comme arguments pour des fonctions attendant des types concrets peut entraîner des erreurs de compilation.
Problème :
Considérez l'exemple donné, où la structure Charmander est définie en tant que type générique avec un paramètre de type F. Lorsque vous tentez d'utiliser la puissance d'attaque de Charmander pour infliger des dégâts à l'aide de la méthode InflictDamage, le compilateur génère une erreur.
Message d'erreur :
cannot use c.AttackPower (variable of type float64 constrained by Float) as float64 value in argument to other.ReceiveDamage compiler(IncompatibleAssign)
Cette erreur se produit car la méthode InflictDamage attend un argument float64, mais la variable AttackPower est d'un type contraint, F.
Solution :
Pour résoudre cette erreur, il est nécessaire d'utiliser des conversions de types. Le type contraint F peut être converti en float64 en convertissant explicitement sa valeur, comme indiqué dans le code révisé :
func (c *Charmander[T]) ReceiveDamage(damage float64) { c.Health -= T(damage) } func (c *Charmander[T]) InflictDamage(other Pokemon) { other.ReceiveDamage(float64(c.AttackPower)) }
Ces conversions sont valides car float64 est compatible avec float32 et float64, les types autorisés par le tapez le paramètre F. Il est important de noter que la conversion explicite de F en float64 peut entraîner une perte de précision si F est instancié avec float32.
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!