Maison > développement back-end > Golang > le corps du texte

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

Linda Hamilton
Libérer: 2024-10-27 04:33:30
original
243 Les gens l'ont consulté

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>
Copier après la connexion

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>
Copier après la connexion

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>
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal