ホームページ > バックエンド開発 > Golang > Go でジェネリック構造体フィールドにリテラル値を代入するときに発生する「IncompatibilityAssign」エラーを解決するにはどうすればよいですか?

Go でジェネリック構造体フィールドにリテラル値を代入するときに発生する「IncompatibilityAssign」エラーを解決するにはどうすればよいですか?

Mary-Kate Olsen
リリース: 2024-12-16 00:29:14
オリジナル
402 人が閲覧しました

How Can I Resolve

ジェネリックでの型割り当て制約の処理

ジェネリック型の構造体フィールドにリテラル値を代入すると、「IncompatibilityAssign」エラーが発生する可能性があります。この問題は、整数や浮動小数点数など、同じ「型グループ」に属さない型が型制約に含まれている場合に発生します。

この特定のコンテキストでは、メソッド宣言

func (f *foo[float64]) setValToPi() {
    f.val = 3.14 // IncompatibleAssign: cannot use 3.14 (untyped float constant) as float64 value in assignment
}
ログイン後にコピー

ジェネリック型 foo のフィールドに浮動小数点リテラルを割り当てようとします。ただし、型パラメータ T は ~float32 | に制限されます。 ~float64 | ~int は、foo のインスタンスが整数型でインスタンス化される可能性があることを意味します。

このエラーが発生する理由を理解するには、メソッド宣言だけではジェネリック型がインスタンス化されないことを認識することが重要です。角括弧内の型パラメーター float64 は、foo 構造体のインスタンス化に使用される実際の型の単なるプレースホルダーです。

メソッド内では、フィールド val の型に関する唯一の情報は、それがconstraint に制約されているということです。必ずしも float64 である必要はありません。浮動小数点リテラル 3.14 は型指定されていません。つまり、foo の考えられるすべてのインスタンス、特に整数型のインスタンスに安全に割り当てることができません。

この問題を解決するには、ジェネリック パラメーターを使用する方法があります。メソッド内で固定型の代わりに型を使用します:

func (f *foo[T]) SetValue(val T) {
    f.val = val
}
ログイン後にコピー

これにより、メソッドはジェネリック パラメーター型の値を受け入れることができ、使用される型に関係なく互換性が確保されます。 foo をインスタンス化します。

あるいは、他の解決策には、フィールド タイプとして any/interface{} を使用することや、インターフェイス タイプを使用した型アサーションやジェネリックなどの手法を検討することも含まれます。

以上がGo でジェネリック構造体フィールドにリテラル値を代入するときに発生する「IncompatibilityAssign」エラーを解決するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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