```
package main
import (
"runtime"
"sync"
)
func main() {
runtime.GOMAXPROCS(1)
var wg sync.WaitGroup
wg.Add(10)
for i := 0; i < 10; i++ {
go func() {
fmt.Println(i)
wg.Done()
}()
}
wg.Wait()
}
```
为什么输出结果是10 10 10 10 10 10 10 10 10 10 呢
2楼 <a href="/user/lionhp" title="@lionhp">@lionhp</a> 你这个觉悟不准确。“匿名函数在不传值的情况下只能获取最后一次循环的值了”这句话是错误的。并不一定是获取最后一次循环的值。如果GOMAXPROCS不是1的话,并且循环非常多次数的话,有些goroutine会在for循环进行中运行,取得值那就是当前i的值。这涉及到runtime的G、P和M。
例子如下:
```
package main
import (
"fmt"
"runtime"
"sync"
)
func main() {
runtime.GOMAXPROCS(4)
j := 1000000
var wg sync.WaitGroup
wg.Add(j)
for i := 0; i < j; i++ {
go func() {
fmt.Println(i)
wg.Done()
}()
}
wg.Wait()
}
```
#4
更多评论
`注意传参数和闭包`
```
package main
import (
"fmt"
"runtime"
"sync"
)
func main() {
runtime.GOMAXPROCS(1)
var wg sync.WaitGroup
wg.Add(10)
for i := 0; i < 10; i++ {
go func(i int) {
fmt.Println(i)
wg.Done()
}(i)
}
wg.Wait()
}
```
#1