Maison  >  Article  >  développement back-end  >  Comment transmettre des types contraints comme arguments de fonction dans les génériques Go 1.18 ?

Comment transmettre des types contraints comme arguments de fonction dans les génériques Go 1.18 ?

Linda Hamilton
Linda Hamiltonoriginal
2024-10-27 04:33:30164parcourir

How to Pass Constrained Types as Function Arguments in Go 1.18 Generics?

Gestion des types contraints en tant qu'arguments de fonction dans les génériques Go 1.18

Go 1.18 a introduit les génériques, permettant aux développeurs de créer des fonctions et des types qui fonctionnent sur des paramètres arbitraires. types de données. Cependant, lorsque vous essayez de transmettre un type contraint comme argument à une fonction qui attend un type concret, le compilateur peut générer une erreur.

Pour illustrer ce problème, considérons l'exemple suivant :

<code class="go">type Pokemon interface {
    ReceiveDamage(float64)
    InflictDamage(Pokemon)
}

type Float interface {
    float32 | float64
}

type Charmander[F Float] struct {
    Health      F
    AttackPower F
}</code>

Ici, Charmander implémente l'interface Pokémon et accepte un paramètre de type générique F qui doit être float32 ou float64.

<code class="go">func (c *Charmander[float64]) ReceiveDamage(damage float64) {
    c.Health -= damage
}

func (c *Charmander[float64]) InflictDamage(other Pokemon) {
    other.ReceiveDamage(c.AttackPower)
}</code>

Cependant, le compilateur génère une erreur dans la méthode InflictDamage, indiquant que c. AttackPower ne peut pas être utilisé comme argument float64 pour la fonction other.ReceiveDamage. En effet, malgré l'instanciation de la structure Charmander sous la forme *Charmander[float64], le compilateur considère toujours AttackPower comme étant de type F.

La solution à ce problème réside dans l'utilisation de conversions de type. ReceiverDamage attend un float64, mais AttackPower est toujours contraint à F. Par conséquent, nous devons convertir AttackPower en float64 :

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

Ces conversions se compilent car float64 est convertible en tous les types dans l'ensemble de types de F (float32 et float64).

Notez que la conversion T(damage) peut entraîner une perte de précision si T est instancié avec float32. Cependant, il est peu probable que cela constitue un problème dans ce cas d'utilisation spécifique.

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn