混合値制約を持つジェネリック型の IncompatibilityAssignErrors の管理
Go では、ジェネリック型を使用して、フィールドに特定の制約を持つ型を作成できます。ただし、制約内で異なる型グループが混在している場合、値リテラルを構造体フィールドに割り当てると、IncompatibilityAssign エラーが発生する可能性があります。
次の例を考えてみましょう:
type constraint interface { ~float32 | ~float64 } type foo[T constraint] struct { val T } func (f *foo[float64]) setValToPi() { f.val = 3.14 }
このコードは、リテラル 3.14 を val に割り当てます。 foo[float64] 型のフィールド。 3.14 は有効な 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 }
このエラーはメソッド宣言に起因します:
func (f *foo[float64]) setValToPi() { // ... }
ここでは、float64 は、意図された制約ではなく、型パラメーター名として扱われます。その結果、コンパイラは val フィールドの特定の型を判断できず、3.14 がすべての可能な制約インスタンスと互換性があるかどうかを検証できません。
これを解決するには、ジェネリック メソッド パラメータを使用して次の値を受け入れることが不可欠です。代わりに型パラメータ type:
func (f *foo[T]) SetValue(val T) { f.val = val }
このソリューションは、このコンテキストでは不適切な行為である 3.14 のような固定値の割り当てを防ぎます。別のアプローチには、フィールド タイプとして any/interface{} を使用することが含まれます。
以上がGo ジェネリクスで混合型制約を使用するときに IncompatibilityAssign エラーを回避するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。