Go 1.18 ジェネリックで制約付き型を関数の引数として渡すにはどうすればよいですか?

Linda Hamilton
リリース: 2024-10-27 04:33:30
オリジナル
243 人が閲覧しました

How to Pass Constrained Types as Function Arguments in Go 1.18 Generics?

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

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート