Go では変数は宣言されていないといけません。
var i int
i = 10
関数の中などの条件が揃う場合は、省略形式で型推論による宣言ができます。
i := 10 // i は int として宣言され代入される
そして、同じ変数の宣言は同じブロックでは一度しかできません。
var i int
// snip
var i int // i redeclared in this block
省略形式も同じ(がエラーは違う)
var i int
i := 10 // no new variables on left side of :=
しかし、省略形式の時は宣言する変数のうち少なくともひとつがブランク変数(_)ではない、
新しい変数であれば、他は再宣言ではなく単なる代入として扱えます。
var i int
i, j := 10, 20
最初なんでこれが動くのか謎だったんですが、ちゃんとドキュメントにありました。
http://golang.org/ref/spec#Short_variable_declarations
http://golang.jp/go_spec#Short_variable_declarations
こが使える場面なんですが、自分が見つけたのは以下のような場合でした。
すでに err のような取回す変数が宣言されていて、それ以外の値も含めた多値を返す関数を呼ぶとき。
var err error
i, err := hoge()
もし err 側で再宣言とみなされると、 i にあたるものはいちいち宣言しないといけない。
これが err の方は単なる代入になり、いちいち i にあたるものを宣言しないでいい。