在函数中使用约束类型作为参数
在 Go 1.18 中,泛型提供了一种使用类型参数定义类型的方法,将其约束为特定类型套。但是,当使用约束类型作为需要具体类型的函数的参数时,您可能会遇到错误。让我们探索使用类型转换的解决方案。
考虑提供的示例:
<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>
当您尝试编译此程序时,您会遇到错误,因为 c.AttackPower 的类型为 F限制为 float64,但 other.ReceiveDamage() 需要 float64 参数。
要解决此问题,您需要将 c.AttackPower 显式转换为满足 Float 的具体类型。在这种情况下,float32 和 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>
通过这些转换,程序将成功编译。注意,实例化 Charmander 类型时,必须指定 F 应该绑定的具体类型,如 *Charmander[float64].
以上是在 Go 函数中使用约束类型作为参数时如何解决类型错误?的详细内容。更多信息请关注PHP中文网其他相关文章!