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

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

Susan Sarandon
Libérer: 2024-10-27 08:08:31
original
312 Les gens l'ont consulté

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

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

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

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

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!

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
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!