Utilisation de types contraints comme arguments dans les fonctions
Dans Go 1.18, les génériques fournissent un moyen de définir des types avec des paramètres de type, contraints à un type spécifique ensembles. Cependant, vous pouvez rencontrer une erreur lors de l'utilisation de types contraints comme arguments pour des fonctions attendant des types concrets. Explorons une solution utilisant des conversions de type.
Considérez l'exemple fourni :
<code class="go">type Pokemon interface { ReceiveDamage(float64) InflictDamage(Pokemon) } type Float interface { float32 | float64 } type Charmander[F Float] struct { Health F AttackPower F } func (c *Charmander[float64]) ReceiveDamage(damage float64) { c.Health -= damage } func (c *Charmander[float64]) InflictDamage(other Pokemon) { other.ReceiveDamage(c.AttackPower) }</code>
Lorsque vous essayez de compiler ce programme, vous rencontrerez une erreur car c.AttackPower est de type F contraint à float64, mais other.ReceiveDamage() attend un argument float64.
Pour résoudre ce problème, vous devez convertir explicitement c.AttackPower en un type concret qui satisfait Float. Dans ce cas, float32 et float64 satisfont à la contrainte, vous pouvez donc convertir vers l'un ou l'autre.
Les méthodes mises à jour deviennent :
<code class="go">func (c *Charmander[T]) ReceiveDamage(damage float64) { c.Health -= T(damage) } func (c *Charmander[T]) InflictDamage(other Pokemon) { other.ReceiveDamage(float64(c.AttackPower)) }</code>
Avec ces conversions, le programme sera compilé avec succès. Notez que lors de l'instanciation du type Charmander, vous devez spécifier le type concret auquel F doit être lié, tel que *Charmander[float64].
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!