ホームページ > バックエンド開発 > Golang > Go 1.18 ジェネリックで制約付き型を引数として処理するにはどうすればよいですか?

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

Susan Sarandon
リリース: 2024-10-27 08:08:31
オリジナル
431 人が閲覧しました

How to Handle Constrained Types as 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。ただし、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 サイトの他の関連記事を参照してください。

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