```
package main
import (
"fmt"
"runtime"
"sync"
)
func init() {
fmt.Println("Current Go Version:", runtime.Version())
}
func main() {
runtime.GOMAXPROCS(1)
count := 10
wg := sync.WaitGroup{}
wg.Add(count * 2)
for i := 0; i < count; i++ {
go func() {
fmt.Printf("[%d]", i)
wg.Done()
}()
}
for i := 0; i < count; i++ {
go func(i int) {
fmt.Printf("-%d-", i)
wg.Done()
}(i)
}
wg.Wait()
}
```
猜想代码想要说明两个问题:
**一是匿名函数中的循环变量快照问题**:第一个for循环问题(一般情况下这么认为这段代码是有问题的)的原因在于循环变量的作用域,for循环语句引入了新的词法块,循环变量`i`在这个词法块中被声明。在该循环中生成的所有函数值都共享相同的循环变量。**需要注意**,函数值中记录的是循环变量的内存地址,而不是循环变量某一时刻的值,后续的迭代会不断更新`i`的值,当函数执行时,for循环已完成,`i`中存储的值等于最后一次迭代的值。为了解决这个问题,我们会引入一个局部变量,作为循环变量的副本,如图:
![image.png](https://static.studygolang.com/180109/9d998e0fd80d154cc8e8d4603c37d57c.png)
**二是**, GOMAXPROCS设置为1,是设置一个cpu核心去处理,将影响goroutine的并发,代码中的go func()相当于串行执行(不是并行),所有输出结果始终是一样
#12
更多评论
这里是答案
https://wide.b3log.org/playground/0bc5162cf88188d75a2e59ef537085d0.go
#1