# 详解Golang中的sync.WaitGroup

## 简介
在Golang中,sync.WaitGroup是用于等待一组goroutine完成执行的工具。在并发编程中,我们经常需要等待多个goroutine执行完毕后再继续执行其他操作,这时就可以使用sync.WaitGroup来实现同步等待的功能。

## 流程概述
下面是使用sync.WaitGroup的一般流程:
| 步骤 | 操作 |
|-------|--------|
| 1 | 创建一个WaitGroup对象 |
| 2 | 启动goroutine,并在其中执行需要等待的任务 |
| 3 | 在goroutine中执行完任务后,调用WaitGroup的Done()方法 |
| 4 | 在主goroutine中调用WaitGroup的Wait()方法,等待所有goroutine执行完毕 |

## 操作步骤
### 步骤1:创建WaitGroup对象
首先,我们需要创建一个sync.WaitGroup对象,用来等待多个goroutine完成执行。

```go
package main

import (
"fmt"
"sync"
)

func main() {
var wg sync.WaitGroup // 创建一个WaitGroup对象
// other code...
}
```

### 步骤2:启动goroutine并执行任务
在需要等待的任务中,我们启动goroutine并执行相应的操作,例如在一个for循环中启动多个goroutine。

```go
for i := 0; i < 5; i++ {
wg.Add(1) // 每启动一个goroutine,增加WaitGroup的计数
go func(num int) {
defer wg.Done() // 在goroutine执行完毕后,调用Done()方法将计数减一
// do some work...
fmt.Println("Goroutine", num, "finished")
}(i)
}
```

### 步骤3:在goroutine中调用Done()方法
在每个goroutine执行完任务后,需要调用WaitGroup的Done()方法将计数减一。

### 步骤4:在主goroutine中等待所有goroutine执行完毕
在主goroutine中,我们需要调用WaitGroup的Wait()方法,等待所有计数都被减为0,表示所有goroutine都执行完毕。

```go
wg.Wait() // 等待所有goroutine执行完毕
fmt.Println("All goroutines have finished")
```

## 完整示例
下面是一个完整的示例,演示了如何使用sync.WaitGroup等待多个goroutine执行完毕:

```go
package main

import (
"fmt"
"sync"
)

func main() {
var wg sync.WaitGroup

for i := 0; i < 5; i++ {
wg.Add(1)
go func(num int) {
defer wg.Done()
fmt.Println("Goroutine", num, "started")
// 模拟一些耗时的操作
for j := 0; j < 100000000; j++ {

}
fmt.Println("Goroutine", num, "finished")
}(i)
}

wg.Wait()
fmt.Println("All goroutines have finished")
}
```

在这个示例中,我们启动了5个goroutine,并在每个goroutine中模拟了一些耗时的操作。最后,使用Wait()方法等待所有goroutine执行完毕后输出"All goroutines have finished"。

通过上面的步骤和示例,希望你已经了解了如何在Golang中使用sync.WaitGroup来同步等待多个goroutine的执行。这是并发编程中常用的技巧之一,能够很好地控制程序的并发执行流程。祝你在学习Golang的路上越走越远!