Maison  >  Article  >  développement back-end  >  Comment résoudre les erreurs de type lors de l'utilisation de types contraints comme arguments dans les fonctions Go ?

Comment résoudre les erreurs de type lors de l'utilisation de types contraints comme arguments dans les fonctions Go ?

Patricia Arquette
Patricia Arquetteoriginal
2024-10-27 02:43:03152parcourir

How to Resolve Type Errors When Using Constrained Types as Arguments in Go Functions?

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!

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