我在看别人代码的时候:
for i := 0; i < 100; i++ {
go func(i int) {
fmt.Println(i)
}(i)
}
我知道
for i := 0; i < 100; i++ {
}
是遍历 0- 99 次。
但是:里面的这个代码是什么意思?是指的开辟多线程异步执行吗?
go func(i int) {
fmt.Println(i)
}(i)
如果是开多线程,为何不用下面两种方式:
go func() {
fmt.Println(i)
}()
go func(i int) {
fmt.Println(i)
}()
是开协程,不是线程。
这种写法叫闭包函数。你自己分别按这两种写法运行看看就知道差别了。
可能形参实参都叫 i 所以你迷糊了,换个名字看可能更清晰:
JS 中也有类似的问题,也是面试题中常见的问题之一:
本质就是为了防止变量作用域污染。