go语言以语法简洁著称,但变量定义比较麻烦,为了方便go语言提供了更加简便的变量声明,同时初始化的语法
名字 := 表达式
这种方式可以声明初始化一组变量:
i, j := 0, 1
尤其是函数有多返回值的时候,异常方便,所以在go语言代码中比较多见。但其中确有难以察觉的坑。
先看一个小例子:
package main
import "fmt"
func main() {
cursor := 10
for cursor != 0 {
cursor, i := cursor-10, 0
i++
fmt.Println(i, cursor)
}
}
在这个例子中,原本希望循环一次后,cursor 变为零,程序退出循环。实际的运行结果却是:
1 0
1 0
1 0
1 0
1 0
1 0
1 0
.... 无限循环
这是为什么呢?
:= 左边变量中只要有一个未定义变量就可以。依据程序本意,已经在第6行定义了cursor, 所以在第9行:= 语句中只是i变量是既声明又初始化,而curosor 仅仅是赋值而已。想法很好,但现实是第6行的cursor变量和:=左边的变量不是一个作用域,在这个作用域可以再定义一个cursor变量,所以实际上第9行cusor 就被重新定义了。到for 循环位置新定义的变量cursor已经离开作用域,也就是6行定义的cursor起作用,即cursor = 10, 循环无法退出。
知道原因大家就可以想出很多解决方案。举个简单的例子如下:
func main() {
cursor := 10
for cursor != 0 {
i := 0
cursor, i = cursor-10, 0
i++
fmt.Println(i, cursor)
}
}
一切静好...