構造体を使用した代入での型推論
Go の型推論は、特定のシナリオで明示的な型アノテーションを省略できる便利な機能です。ただし、構造化型のフィールドに値を割り当てる場合、特定の制限が発生する可能性があります。
次のコード スニペットを検討してください。
i := 10 next := 11 prev, i := i, next
ここで、 i への代入は prev の型を推測し、宣言します。 int.
type Foo struct { Bar int } f := Foo{10} next := 11 prev, f.Bar := f.Bar, next
ただし、このコードでは、f.Bar への代入では、次の型を推論できません。前へ代わりに、次のエラーが生成されます。「:= の左側に名前がありません。
なぜこれが発生しますか?」構造体型 (Foo) の存在により、型推論プロセスが中断されることがわかりました。単純な割り当て (最初のコード スニペットのような) では、型推論はコンテキストに依存して、割り当てられた変数の型を決定します。ただし、2 番目のコード スニペットでは、構造体の存在によって複数のコンポーネントを含む式が作成され、型推論があいまいになります。
これは Go のバグですか?結局のところ、これは問題 6842 で議論されている既知の問題です:
問題 6842: 仕様: 短い宣言表記によるフィールドへの代入
問題は未解決のままであり、この動作が意図されたものであることを示しています。この制限を回避するには、prev 変数に明示的に注釈を入力するか、f.Bar = next.
などの長い形式の代入を使用します。以上がGo の型推論が構造体フィールドの代入で失敗するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。