Go 1.18 では、ジェネリックスに型パラメータを制約する機能が導入され、柔軟性と型安全性が向上しました。ただし、具体的な型を期待する関数の引数として制約された型を使用すると、予期しない動作が発生する可能性があります。
次の例を考えてみましょう。ここでは、Float (float32) に制約された型パラメータを持つポケモン インターフェイスとヒトカゲの構造体を定義しています。または float64):
<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>
私たちの目標は、ヒトカゲの AttackPower フィールドを使用して、InflictDamage メソッドでダメージを与えることです。ただし、このメソッドを実装すると、次のエラーが発生します。
cannot use c.AttackPower (variable of type float64 constrained by Float) as float64 value in argument to other.ReceiveDamage compiler(IncompatibleAssign)
このエラーは、ヒトカゲ構造体を *Charmander[float64] としてインスタンス化しているにもかかわらず、 AttackPower フィールドが依然としてタイプ F であるために発生します。 Float に制約されます。このコンテキストでは、Float には float32 と float64 の両方が含まれており、コンパイラーはこれらの間で自動的に変換できません。
この問題を解決するには、 AttackPower フィールドを、他のフィールドで予期されるタイプである float64 に明示的に変換する必要があります。メソッドの引数:
<code class="go">func (c *Charmander[T]) InflictDamage(other Pokemon) { other.ReceiveDamage(float64(c.AttackPower)) }</code>
この変換により、 AttackPower の値が other.ReceiveDamage メソッドに正しく渡されることが保証されます。さらに、型の一貫性を維持するために、ReceiveDamage メソッドでdamage パラメーターを型 F に変換する必要があります。
<code class="go">func (c *Charmander[T]) ReceiveDamage(damage float64) { c.Health -= T(damage) }</code>
これらの型変換を実装することで、具体的な型を期待する関数の引数として制約付き型を使用できます。型の安全性を維持し、コンパイラ エラーを回避します。異なる float 型間で変換する場合、型変換により精度が失われる可能性があることに注意することが重要です。
以上が具体的な型が必要な場合、Go 関数の引数として制約付き型を使用するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。