Maison  >  Article  >  développement back-end  >  Comment gérer les types contraints en tant qu’arguments dans les génériques Go 1.18 ?

Comment gérer les types contraints en tant qu’arguments dans les génériques Go 1.18 ?

Susan Sarandon
Susan Sarandonoriginal
2024-10-27 08:08:31309parcourir

How to Handle Constrained Types as Arguments in Go 1.18 Generics?

Utilisation de types contraints comme arguments dans Go 1.18

Dans les génériques Go 1.18, les types contraints permettent aux développeurs de définir des types de données personnalisés avec des contraintes spécifiées. Cependant, lorsque vous utilisez des types contraints comme arguments pour des fonctions qui attendent des types concrets, une conversion de type est requise.

Considérez 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 avec un générique tapez le paramètre F qui peut être instancié avec float32 ou float64. Cependant, les tentatives d'utilisation d'AttackPower (un type contraint) comme argument float64 dans other.ReceiveDamage() entraînent une erreur :

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

Conversion de type pour la compatibilité

Pour résoudre ce problème, une conversion de type doit être utilisée pour assurer la compatibilité entre le type contraint et le type concret attendu par la fonction. En effet, F n'est pas équivalent à float64 même lorsqu'il est contraint à float64.

Le code corrigé devient :

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

De même, la méthode ReceiverDamage() est modifiée pour gérer un type contraint ( Health) en convertissant l'argument de dommage en type contraint :

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

Considérations sur la précision

Il est important de noter que la conversion de float64 en float32 (quand F est instancié avec float32) peut entraîner une perte de précision. Cela devra peut-être être pris en compte dans des cas d'utilisation spécifiques.

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