ホームページ  >  記事  >  バックエンド開発  >  具体的な型が必要な場合、Go 関数の引数として制約付き型を使用するにはどうすればよいですか?

具体的な型が必要な場合、Go 関数の引数として制約付き型を使用するにはどうすればよいですか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-10-27 07:15:29185ブラウズ

 How Can I Use Constrained Types as Arguments in Go Functions When They Expect Concrete Types?

Go 1.18 ジェネリクスで制約付き型を引数として使用する

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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。