このスニペットは期待どおりに動作します play.golang.org/p/VuCl-OKMav
i := 10
next := 11
prev, i := i, next
ただし、このほぼ同じスニペットはnon-name f.Bar on left side of :=
play.golang.org/p/J8NNWPugQG
type Foo struct {
Bar int
}
f := Foo{10}
next := 11
prev, f.Bar := f.Bar, next
型推論を停止する構造体の特別な点は何ですか?これはバグですか?
これは未解決の問題です。
問題6842 :仕様:短い宣言表記でフィールドに割り当てる
仕様の「短い変数の宣言」セクションから:
「通常の変数宣言とは異なり、短い変数宣言は、同じブロックで以前に同じ型で宣言されていて、少なくとも1つの非空白変数が新しい場合、変数を再宣言できます。」
したがって、別の型(この例ではFoo構造体)内で変数を宣言すると、「同じブロックで以前に宣言されていた場合」によって失格となります。
そのため、:=構文を使用せずに、事前に宣言された変数を単に値に設定するだけです。
...
var prev int
prev, f.Bar = f.Bar, next
...