Go 1.18 ジェネリクスの関数引数としての制約型
Go 1.18 のジェネリックスは強力な型制約を提供し、開発者はカスタム型を定義できます。特定の行動。ただし、これらの制約された型を具体的な型を期待する関数の引数として使用すると、コンパイル エラーが発生する可能性があります。
問題:
ヒトカゲの構造体が定義されている例を考えてみましょう。型パラメーター F を持つジェネリック型として。InflictDamage メソッドを使用してダメージを与えるためにヒトカゲの攻撃力を使用しようとすると、コンパイラによってエラーが発生します。
エラー メッセージ:
cannot use c.AttackPower (variable of type float64 constrained by Float) as float64 value in argument to other.ReceiveDamage compiler(IncompatibleAssign)
このエラーは、InflictDamage メソッドが float64 引数を予期しているにもかかわらず、 AttackPower 変数が制約された型 F であるために発生します。
解決策:
このエラーを解決するには、型変換を使用する必要があります。制約付き型 F は、改訂されたコードに示すように、その値を明示的にキャストすることで float64 に変換できます。
func (c *Charmander[T]) ReceiveDamage(damage float64) { c.Health -= T(damage) } func (c *Charmander[T]) InflictDamage(other Pokemon) { other.ReceiveDamage(float64(c.AttackPower)) }
float64 は、float32 と float64 の両方と互換性があるため、これらの変換は有効です。型パラメータ F。F が float32 でインスタンス化されている場合、F を float64 に明示的にキャストすると精度が失われる可能性があることに注意することが重要です。
以上が記事の内容に適した質問ベースのタイトルをいくつか示します。 * Go 1.18 ジェネリックで制約された型を関数の引数として使用する方法: これは、次の点を強調する直接的で有益なタイトルです。の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。