Go 1.18 での引数としての制約付き型の使用
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 }</code>
ここでは、ヒトカゲはジェネリック関数を使用してポケモン インターフェイスを実装しています。 float32 または float64 でインスタンス化できる型パラメータ F。ただし、Other.ReceiveDamage() の float64 引数として AttackPower (制約された型) を使用しようとすると、エラーが発生します:
<code class="go">func (c *Charmander[float64]) InflictDamage(other Pokemon) { other.ReceiveDamage(c.AttackPower) }</code>
互換性のための型変換
この問題を解決するには、型変換を使用して、制約された型と関数が期待する具象型の間の互換性を確保する必要があります。これは、F が float64 に制約されていても float64 と同等ではないためです。
修正されたコードは次のようになります。
<code class="go">func (c *Charmander[T]) InflictDamage(other Pokemon) { other.ReceiveDamage(float64(c.AttackPower)) }</code>
同様に、ReceiveDamage() メソッドは、制約された型 ( Health) を次の制約付きタイプに変換することで、ダメージ引数を次のように変換します。
<code class="go">func (c *Charmander[T]) ReceiveDamage(damage float64) { c.Health -= T(damage) }</code>
精度に関する考慮事項
float64 から float32 への変換 (F の場合) に注意することが重要です。 float32 でインスタンス化される) 結果として精度が失われる可能性があります。これは、特定の使用例で考慮する必要がある場合があります。
以上がGo 1.18 ジェネリックで制約付き型を引数として処理するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。