go语言支持多变量同时赋值或者初始化,这是一个很方便的特性。它也允许使用:=操作符同时声明部分新变量,并且给已有变量赋值,这会带来一些需要注意的问题,一不小心就产生bug。
看一段代码:
package main
import "fmt"
func main() {
a, b := 1, 2
b, c := 3, 4
fmt.Println(a, b, c)
}
这里“b, c:= 3, 4”语句是给已有变量b赋值,同时把一个新变量c初始化为4,因此程序的输出结果是:
1 3 4
但是如果这行语句是在另外一个代码块里,效果就不一样了。
package main
import "fmt"
func main() {
a, b := 1, 2
if true {
b, c := 3, 4
fmt.Println(b, c)
}
fmt.Println(a, b)
}
这个程序输出的结果是:
3 4
1 2
说明"b, c := 3, 4"语句是初始化了两个新的变量,其中b和外部变量b重名。
所以结论是:
在同一个函数另外一个代码块,使用:=初始化多个变量时,外部同名变量被自动屏蔽。
这个问题还是挺容易遇到的,新手可能不知道,而老手也可能会不留神给忽略了,结果产生bug。如果能有编译警告就好一些,但是还不清楚有没有这样的编译选项。