因为自身对js还算熟悉,js里闭包变量引用的问题不用赘述了,当在go语言中遇到类似的场景时,出于谨慎,测试了一下,果然跟js行为差不多,匿名函数中使用外部变量,尤其是在for循环+匿名函数创建 goroutine时尤其注意。
错误用法:
for i:=0;i<10;i++ {
go func(){
time.Sleep(time.Second)
fmt.Println(i)
}
}
错误输出结果都是 10
正确用法:
for i:=0;i<10;i++ {
go func(i int){
time.Sleep(time.Second)
fmt.Println(i)
}(i)
}
这样子,虽然匿名函数是异步执行的,但是 i 是立即求值的,所以每个goroutine输出的i都不一样。
同样适用于 defer 语句,如 defer func(i int){ fmt.Println(i) }(i)