ジェネリック構造体フィールドへの値リテラルの割り当て: IncompatibilityAssignment エラーのトラブルシューティング
Go では、許可される型を制限する制約を使用してジェネリック型を定義できます。自分たちの分野のために。ただし、そのようなフィールドに値リテラルを割り当てる場合、特定の制約によって「IncompatibilityAssign」エラーが発生する可能性があります。
次のシナリオを考えてみましょう。
type constraint interface { ~float32 | ~float64 } type foo[T constraint] struct { val T } func (f *foo[float64]) setValToPi() { f.val = 3.14 }
制約インターフェイスには次のものが含まれるため、このコードはエラーなしでコンパイルされます。 ~float32 と ~float64 の両方。ただし、 ~int:
type constraint interface { ~float32 | ~float64 | ~int } type foo[T constraint] struct { val T } func (f *foo[float64]) setValToPi() { f.val = 3.14 // IncompatibleAssign: cannot use 3.14 (untyped float constant) as float64 value in assignment }
も含めるように制約を変更すると、値リテラル 3.14 (型なし浮動小数点定数) を foo[T のすべての可能なインスタンスに割り当てることができないため、エラーが発生します。 ]、特に T が ~int であるもの。
この問題は、メソッドが次の理由で発生します。宣言:
func (f *foo[float64]) setValToPi() { // ... }
は単なる宣言です。ジェネリック型 foo はインスタンス化されません。角括弧内の識別子 float64 は、固定型ではなく型パラメーター名です。
したがって、メソッド内で val の型に関する既知の情報は、val がconstraint によって制約されているということだけです。この場合、制約は共用体 ~float32 | です。 ~float64 | ~int。値 3.14 を foo[T] の ~int インスタンスに割り当てることができないことを意味します。
解決策:
この問題を解決するには、いくつかのオプションがあります。 :
func (f *foo[T]) setValToPi() { // ... }
これは同じエラーになりますが、float64 の代わりに T を使用します。
func (f *foo[T]) SetValue(val T) { f.val = val }
これは型パラメータ type の値を受け入れ、3.14 のような値リテラルの割り当てを許可します。
type foo struct { val interface{} } func (f *foo) SetPi() { f.val = 3.14 }
以上がGo で値リテラルをジェネリック構造体フィールドに代入すると、「IncompatibilityAssign」エラーが発生する場合があるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。