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

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

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-12-16 00:29:14403ブラウズ

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

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