Go の謎: 構造体の代入における型推論の欠如
Go では、短縮宣言構文を使用して値を代入するのが一般的です。コードの可読性と効率性を向上させます。ただし、この単純さは、次のスニペットで示されているように、特定のシナリオに遭遇したときにプログラマをつまずかせる可能性があります。
i := 10 next := 11 prev, i := i, next
このコード スニペットは、next の値を i に割り当て、同時に i を prev に再割り当てします。この動作は直感的であり、期待どおりに機能します。ただし、構造体フィールドが関係する場合、次のコードで明らかなように、型推論は失敗します。
type Foo struct { Bar int } f := Foo{10} next := 11 prev, f.Bar := f.Bar, next
この場合、短縮構文を使用して構造体フィールドに値を代入しようとすると、次の結果が得られます。コンパイラ エラー: 「:="
の左側に名前がありません。」 驚くべきことに、このエラーは構造体を処理する場合にのみ発生します。この動作の背後にある謎を解明するために、Go コンパイラーの型推論の複雑なメカニズムを詳しく調べます。
コンパイラーは短縮宣言に遭遇すると、右側の式に基づいて型を推測しようとします。課題の手側。変数の場合、このプロセスは簡単です。ただし、構造体フィールドが見つかると、コンパイラはフィールドの型と右側の式の型が一致するかどうかをチェックします。
最初の例では、右側は整数リテラルです。 (11) これは i の型と一致します。したがって、コンパイラは prev も整数であると推測でき、代入は成功します。
2 番目の例では、右側は構造体フィールド (f.Bar) を含む式です。コンパイラーは、左側の型 (この場合は f.Bar) が右側の型と一致することを確認する必要があるため、右側が整数であるという競合に巻き込まれます。ですが、左側は int 型の構造体フィールドです。この不一致により、コンパイラは prev の型を推論できなくなり、エラーが発生します。
この状況の複雑な点は、エラー メッセージには「:= の左側に名前がありません」と表示されることです。原因は、構造体フィールドの関与による型推論の失敗に根本的な問題があるようです。
この動作は、Go の問題で未解決の問題として報告されています。トラッカーでは、構造体を扱う際の Go の型推論の制限を強調しています。これは技術的にはバグとは言えないかもしれませんが、コンパイラーの柔軟性が直観的なコーディングの実践を妨げている領域であることは確かです。
以上がGo の型推論が短縮宣言を使用した構造体の代入に失敗するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。