先看例子:
package main
import (
"fmt"
"math/rand"
"sync"
"time"
)
var wg sync.WaitGroup
func hello(i int) {
defer wg.Done()
fmt.Println("hello go", i)
}
func main() {
for i := 0; i < 10; i++ {
wg.Add(i)
go hello(i)
}
wg.Wait()
}
这个代码看着没问题吧。几乎所有你在国内的网页上能查到的都会是这样的例子,并且告诉你没问题,但实际上会出现如下的错误:
这个错误的意思就是所有的子携程都已经结束了。 但是主线程还在等候。 很多大神都会告诉你没大事。但是怎解决?
按照go的QA上的解决方式例子里, 需要将函数在匿名函数中调用。
修改如下:
package main
import (
"fmt"
"math/rand"
"sync"
"time"
)
var wg sync.WaitGroup
func hello(i int) {
fmt.Println("hello go", i)
}
func main() {
for i := 0; i < 10; i++ {
wg.Add(1)
go func(i int) {
defer wg.Done()
hello(i)
}(i)
}
wg.Wait()
}
代码运行正常。