WaitGroup 是 Go 语言的一个并发控制机制,它可以用于等待一组 goroutine 的结束。WaitGroup 提供了三个方法:Add、Done 和 Wait。
Add 方法:用于设置 WaitGroup 中等待的 goroutine 的数量。Add 方法的参数是一个整数,表示需要等待的 goroutine 的数量。通常在启动每个 goroutine 之前都会调用 Add 方法来增加要等待的 goroutine 的数量。
Done 方法:用于通知 WaitGroup 一个 goroutine 的结束。在 goroutine 的最后调用 Done 方法来减少 WaitGroup 中等待的 goroutine 的数量。
Wait 方法:用于阻塞当前 goroutine,直到 WaitGroup 中等待的 goroutine 的数量变为 0。一般在主 goroutine 里调用 Wait 方法,等待所有子 goroutine 结束后再继续执行。
下面是一个使用 WaitGroup 的示例代码:
package main import ( "fmt" "sync" ) func main() { var wg sync.WaitGroup for i := 0; i < 5; i++ { wg.Add(1) go func(i int) { defer wg.Done() fmt.Printf("goroutine %d\n", i) }(i) } wg.Wait() fmt.Println("All goroutines finished") }
在上面的例子中,首先创建了一个 WaitGroup 对象 wg。然后使用一个 for 循环启动了 5 个 goroutine,并在每个 goroutine 中调用了 wg.Add(1) 来增加 WaitGroup 中等待的 goroutine 的数量。在每个 goroutine 的最后调用了 wg.Done() 来通知 WaitGroup 一个 goroutine 的结束。最后在主 goroutine 中调用了 wg.Wait() 来等待所有的子 goroutine 结束。
上面的代码运行时,可能会输出类似如下的结果:
goroutine 4 goroutine 0 goroutine 3 goroutine 2 goroutine 1 All goroutines finished
可以看到,不同的 goroutine 的输出顺序是随机的,这是因为它们是并发执行的。
总结:WaitGroup 是 Go 语言中一个用于等待一组 goroutine 结束的机制。通过调用 Add、Done 和 Wait 方法,可以实现对一组 goroutine 的并发控制。