`sync.WaitGroup` 是 Go 语言中用于等待一组 goroutine 完成的标准库工具。你可以使用 `WaitGroup` 来同步你的代码,以确保当一组 goroutine 完成其任务后,再继续执行主 goroutine 的其他操作。
`WaitGroup` 的基本用法是:
1. 创建一个 `WaitGroup` 实例
2. 在每个 goroutine 开始时,调用 `Add(n)` 方法(n 通常为 1),以表示有新的 goroutine 正在开始执行
3. 在每个 goroutine 结束时,调用 `Done()` 方法,以表示该 goroutine 已经完成
4. 在主 goroutine 中,调用 `Wait()` 方法来等待所有 goroutine 完成
下面是一个简单的例子:
```go
package main
import (
"fmt"
"sync"
)
func doWork(wg *sync.WaitGroup, id int) {
defer wg.Done() // 在函数返回时自动调用 Done()
// 执行一些任务...
fmt.Printf("Goroutine %d is working...\n", id)
}
func main() {
var wg sync.WaitGroup // 创建一个新的 WaitGroup 实例
// 启动5个并行的 goroutine 来做工作...
for i := 1; i <= 5; i++ {
wg.Add(1) // 为每个新的 goroutine 增加计数器
go doWork(&wg, i) // 启动 goroutine 并传递 WaitGroup 和其他参数
}
// 主 goroutine 需要等待所有工作 goroutine 完成...
wg.Wait() // 阻塞主 goroutine,直到所有工作 goroutine 完成
fmt.Println("All goroutines have completed.") // 所有工作完成后输出信息...
}
```
在这个例子中,我们创建了一个 `WaitGroup` 并启动了5个并行的 goroutine。每个 goroutine 都调用了 `wg.Add(1)` 来增加计数器,并在完成时调用了 `wg.Done()` 来减少计数器。在主 goroutine 中,我们调用了 `wg.Wait()` 来等待所有工作 goroutine 的完成。当所有工作 goroutine 都调用了 `Done()` 方法后,`Wait()` 方法将不再阻塞主 goroutine,并且程序将输出 "All goroutines have completed."。