```
func TestConcurrent(t *testing.T) {
wg := sync.WaitGroup{}
wg.Add(20)
for count := 20; count >= 0; count-- {
go func(count int) {
fmt.Println(count)
defer wg.Done()
}(count)
}
wg.Wait()
}
```
// 会抛出wg 至负数的异常
下面这种通过限制 processor 数量都可以规避。
为什么???
```
func TestConcurrent(t *testing.T) {
runtime.GOMAXPROCS(1)
wg := sync.WaitGroup{}
wg.Add(20)
for count := 20; count >= 0; count-- {
go func(count int) {
fmt.Println(count)
defer wg.Done()
}(count)
}
wg.Wait()
}
```
wg.Add(20)等待20次,但是你的for count := 20; count >= 0; count--{}循环有21次。
main函数的wg.Wait()等到20次wg.Done()就会结束整个程序,不管你的goroutine并发还在没在执行,不信你把for改成50次循环试试。runtime.NumCPU()查看是几个核心的cpu
但是有一种情况假如main函数所在线程还没来得及结束,你for循环里的第21次goroutine线程已经进入执行就会导致wg计数为负数引发panic。
当然你设为1个goroutine运行的时候是单线程,就跟顺序执行差不多,可以及时结束不会进入第21次循环。
#1