web-dev-qa-db-ja.com

Goは、割り当てのタイプを推測できません: "=="の左側の非名前

このスニペットは期待どおりに動作します 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

型推論を停止する構造体の特別な点は何ですか?これはバグですか?

25
deft_code

これは未解決の問題です。

問題6842 :仕様:短い宣言表記でフィールドに割り当てる

18
peterSO

仕様の「短い変数の宣言」セクションから:

「通常の変数宣言とは異なり、短い変数宣言は、同じブロックで以前に同じ型で宣言されていて、少なくとも1つの非空白変数が新しい場合、変数を再宣言できます。」

したがって、別の型(この例ではFoo構造体)内で変数を宣言すると、「同じブロックで以前に宣言されていた場合」によって失格となります。

そのため、:=構文を使用せずに、事前に宣言された変数を単に値に設定するだけです。

...
var prev int
prev, f.Bar = f.Bar, next
...
7
Sean Williams