参考链接:https://studygolang.com/articles/12972?fr=sidebar
sync.WaitGroup
WaitGroup 对象内部有一个计数器,最初从0开始,它有三个方法:Add(), Done(), Wait() 用来控制计数器的数量。
Add(n) 把计数器设置为n ,
Done() 每次把计数器-1 ,
wait() 会阻塞代码的运行,直到计数器地值减为0。
func main() {
wg := sync.WaitGroup{}
wg.Add(100)
for i := 0; i < 100; i++ {
go func(i int) {
fmt.Println(i)
wg.Done()
}(i)
}
wg.Wait()
}
// 这里首先把wg 计数设置为100,
// 每个for循环运行完毕都把计数器减一,主函数中使用Wait() 一直阻塞,直到wg为零
// 也就是所有的100个for循环都运行完毕
注意事项
- 计数器不能为负值,我们不能使用Add() 给wg 设置一个负值,否则代码将会报错
- WaitGroup对象不是一个引用类型,在通过函数传值的时候需要使用地址
func main() {
wg := sync.WaitGroup{}
wg.Add(100)
for i := 0; i < 100; i++ {
go f(i, &wg)
}
wg.Wait()
}
// 一定要通过指针传值,不然进程会进入死锁状态
func f(i int, wg *sync.WaitGroup) {
fmt.Println(i)
wg.Done()
}
有疑问加站长微信联系(非本文作者)