変数宣言の省略形式では、変数のどれか一つが新しい変数でなければならない。すべてが新しい変数である必要はない。この点はvarと異なる。
func main() {
a, b := 1, 2
println(a, b)
// a, b := 1, 2
// => `no new variables on left side of :=`となる
// var a, b, c int = 3, 4, 5
// => `a redeclared in this block` となる
a, b, c := 2, 3, 4
println(a, b, c)
}
この例では、既存のa,bは単に代入となる。
ブロックの中ではスコープが異なるので別の変数となる。
func main() {
a, b := 1, 2
println(a, b)
{
a, b, c := 3, 4, 5
println(a, b, c)
}
println(a, b) // => 1, 2
}
関数の戻り値のパラメータに名前が付いていて、returnで戻り値を省略している場合に、戻り値のパラメータをスコープで隠してしまっていると、コンパイルエラーになってくれる。
func main() {
println(f())
}
func f() (a int) {
{
a, b := 1, 2
println(a, b)
// return
// => `a is shadowed during return`となる
return a
}
}
あと、goで意味のないサンプルコードを書くのは難しい。