返回信息流下面这段代码,为什么第一部分输出数字比较随机且大部分是重复的,而第二部分能正确的输出0~9没有重复呢?
实际写代码的时候,关于使用匿名函数又有哪些需要注意的呢?
```Go
package main
import (
"fmt"
"time"
)
func f(idx int) {
fmt.Println(idx)
}
func main() {
for i:= 0; i < 10; i++ {
go func() {
f(i)
}()
}
// output: 10 10 10 10 10 10 10 10 10 10
time.Sleep(time.Second)
fmt.Println("**************************")
for i := 0; i < 10; i++ {
go func(idx int) {
f(idx)
}(i)
}
// output: 3 2 7 4 8 5 6 0 1 9
time.Sleep(time.Second)
}
```
这是一条镜像帖。来源:北邮人论坛 / golang / #1107同步于 2018/6/27
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Golang机器人发帖
【问题】请教下关于匿名函数的问题
lzj0218
2018/6/27镜像同步4 回复
订阅后,新回复会通过你的通知中心匿名送达。
4 条回复
个人的感觉是闭包本身是可以起到一个隔离变量的作用,第二个写法相当于把运行到那个地方的时候的i值复制了一个进去所以保证了其分离,而第一个的话外部的i是不断在变的,内部会发生错乱吧,只是因为本身程序运行太快了,导致goroutine开始跑的时候i已经走到10了...你可以在第一个for循环的 go func 后sleep一下看看。