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 を受け入れます。
<code class="go">func (c *Charmander[float64]) ReceiveDamage(damage float64) { c.Health -= damage } func (c *Charmander[float64]) InflictDamage(other Pokemon) { other.ReceiveDamage(c.AttackPower) }</code>
ただし、コンパイラーは InflictDamage メソッドでエラーを発生させ、c. であることを示します。 AttackPower は、other.ReceiveDamage 関数の float64 引数として使用できません。これは、ヒトカゲ構造体を *Charmander[float64] としてインスタンス化しているにもかかわらず、コンパイラは依然として AttackPower を F 型であるとみなしているためです。
この問題の解決策は、型変換を使用することにあります。 ReceiveDamage は float64 を想定していますが、 AttackPower は依然として F に制約されています。 したがって、 AttackPower を 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>
float64 は F の型セット内のすべての型に変換できるため、これらの変換はコンパイルされます (float32
T が float32 でインスタンス化されている場合、変換 T(damage) により精度が失われる可能性があることに注意してください。ただし、この特定の使用例では、これが問題になる可能性は高くありません。
以上がGo 1.18 ジェネリックで制約付き型を関数の引数として渡すにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。