【1】WaitGroup的作用:
WaitGroup用于等待一组线程的结束。父线程调用Add方法来设定应等待的线程的数量。每个被等待的线程在结束时应调用Done方法。同时,主线程里可以调用Wait方法阻塞至所有线程结束。---》解决主线程在子协程结束后自动结束
【2】主要方法:
(1)

(2)

(3)

【3】案例:
(1)Add\Done\Wait:
go
package main
import(
"fmt"
"sync"
)
var wg sync.WaitGroup //只定义无需赋值
func main(){
//启动五个协程
for i := 1 ;i <= 5;i++ {
wg.Add(1) //协程开始的时候加1操作
go func(n int){
fmt.Println(n)
wg.Done() //协程执行完成减1
}(i)
}
//主线程一直在阻塞,什么时候wg减为0了,就停止
wg.Wait()
}(2)如果防止忘记计数器减1操作,结合defer关键字使用:
go
package main
import(
"fmt"
"sync"
)
var wg sync.WaitGroup //只定义无需赋值
func main(){
//启动五个协程
for i := 1 ;i <= 5;i++ {
wg.Add(1) //协程开始的时候加1操作
go func(n int){
defer wg.Done()
fmt.Println(n)
}(i)
}
//主线程一直在阻塞,什么时候wg减为0了,就停止
wg.Wait()
}(3)可以最开始在知道协程次数的情况下先Add操作:
go
package main
import(
"fmt"
"sync"
)
var wg sync.WaitGroup //只定义无需赋值
func main(){
wg.Add(5)
//启动五个协程
for i := 1 ;i <= 5;i++ {
go func(n int){
defer wg.Done()
fmt.Println(n)
}(i)
}
//主线程一直在阻塞,什么时候wg减为0了,就停止
wg.Wait()
}注意:Add中加入的数字和协程的次数一定要保持一致