ホームページ > バックエンド開発 > Golang > Go で値リテラルをジェネリック構造体フィールドに代入すると、「IncompatibilityAssign」エラーが発生する場合があるのはなぜですか?

Go で値リテラルをジェネリック構造体フィールドに代入すると、「IncompatibilityAssign」エラーが発生する場合があるのはなぜですか?

Susan Sarandon
リリース: 2024-12-19 06:54:20
オリジナル
626 人が閲覧しました

Why Does Assigning Value Literals to Generic Struct Fields in Go Sometimes Result in

ジェネリック構造体フィールドへの値リテラルの割り当て: 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 インスタンスに割り当てることができないことを意味します。

解決策:

この問題を解決するには、いくつかのオプションがあります。 :

  1. メソッドを宣言しますas:
func (f *foo[T]) setValToPi() {
    // ...
}
ログイン後にコピー

これは同じエラーになりますが、float64 の代わりに T を使用します。

  1. メソッドを次のように宣言します:
func (f *foo[T]) SetValue(val T) {
    f.val = val
}
ログイン後にコピー

これは型パラメータ type の値を受け入れ、3.14 のような値リテラルの割り当てを許可します。

  1. フィールド タイプとして any/interface{} を使用し、メソッド内で割り当てられた値を確認して変換するカスタム メソッドを実装します:
type foo struct {
    val interface{}
}

func (f *foo) SetPi() {
    f.val = 3.14
}
ログイン後にコピー

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

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