sync全称是synchronization,意思是同步。
WaitGroup同步期待组是有一组goroutine要期待执行,而以后的goroutine须要期待这一组goroutine都执行完能力执行。
    上面是WaitGroup的定义:

type WaitGroup struct {    //}

    每个WaitGroup中都有一个计数器counter记录要期待执行gorouting的数量,能够通过Add这个办法来设置同步期待组中期待goroutine的个数。每个goroutine都会执行,执行完之后都会调用done办法示意把计数器的值-1,与此同时,应用wait办法阻塞,直到所goroutine都执行结束。
func (wg *WaitGroup) Add(delta int)

  • 如果计数器的值为0,那么期待过程中被阻塞的goroutine都会被开释
  • 如果计数器得悉为负,那么就会引发panic

那么具体什么状况下用,怎么应用呢?
上面举个例子:

package mainimport "fmt"func main() {    //waitGroup    go fun1()    go fun2()}func fun1() {    for i := 1; i < 10; i++ {        fmt.Println("print A in fun1", i)    }}func fun2() {    for i := 0; i < 10; i++ {        fmt.Println("\t fun2 print: ", i)    }}

这样最初什么都没有打印,因为主goroutine在fun1 fun2这两个goroutine执行之前完结了。这时候就能够用WaitGroup了。

package mainimport (    "fmt"    "sync")//创立同步期待组var wg sync.WaitGroupfunc main() {    //waitGroup    wg.Add(2) //设置计数器为2(goroutine的个数)    go fun1()    go fun2()    fmt.Println("main 进入阻塞状态, 须要期待wg的goroutine完结")    wg.Wait() //示意main goroutine进入阻塞    fmt.Println("计数器归零 进行阻塞")}func fun1() {    defer wg.Done() //计数器-1    for i := 1; i < 10; i++ {        fmt.Println("print A in fun1", i)    }}func fun2() {    defer wg.Done() //计数器-1    for i := 0; i < 10; i++ {        fmt.Println("\t fun2 print: ", i)    }}

后果如下:

main 进入阻塞状态, 须要期待wg的goroutine完结print A in fun1 1print A in fun1 2         fun2 print:  0         fun2 print:  1         fun2 print:  2         fun2 print:  3         fun2 print:  4print A in fun1 3print A in fun1 4print A in fun1 5print A in fun1 6print A in fun1 7print A in fun1 8print A in fun1 9         fun2 print:  5         fun2 print:  6         fun2 print:  7         fun2 print:  8         fun2 print:  9计数器归零 进行阻塞

后果第一行,阐明两个goroutine曾经都启动了,而后交替应用CPU的工夫片。
另外 如果函数执行结束的时候,计数器的值依然大于0,会引起deadlock。


另外 Go语言并不举荐上述写法,更加举荐应用chanel。

材料参考:bilibili