Using Constrained Types as Arguments in Functions
In Go 1.18, generics provide a way to define types with type parameters, constrained to specific type sets. However, you may encounter an error when using constrained types as arguments to functions expecting concrete types. Let's explore a solution using type conversions.
Consider the example provided:
<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>
When you try to compile this program, you'll encounter an error because c.AttackPower is of type F constrained to float64, but other.ReceiveDamage() expects a float64 argument.
To resolve this issue, you need to explicitly convert c.AttackPower to a concrete type that satisfies Float. In this case, both float32 and float64 satisfy the constraint, so you can convert to either.
The updated methods become:
<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>
With these conversions, the program will compile successfully. Note that when instantiating the Charmander type, you must specify the concrete type that F should be bound to, such as *Charmander[float64].
The above is the detailed content of How to Resolve Type Errors When Using Constrained Types as Arguments in Go Functions?. For more information, please follow other related articles on the PHP Chinese website!