ホームページ >バックエンド開発 >Golang >Go ジェネリクスで混合型制約を使用するときに IncompatibilityAssign エラーを回避するにはどうすればよいですか?

Go ジェネリクスで混合型制約を使用するときに IncompatibilityAssign エラーを回避するにはどうすればよいですか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-12-28 10:21:10653ブラウズ

How to Avoid IncompatibleAssign Errors When Using Mixed Type Constraints in Go Generics?

混合値制約を持つジェネリック型の 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 サイトの他の関連記事を参照してください。

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