面试题答案
一键面试WaitGroup使用场景
- 多个goroutine并行处理任务:当需要多个goroutine同时执行不同任务,然后等待所有任务完成时,比如多个goroutine分别从不同数据源读取数据,最后汇总处理。
- 任务分阶段执行:在一个复杂任务中,先并行执行多个子任务,然后等待这些子任务完成后,再执行后续任务。例如先并行计算多个部分的结果,然后将这些结果合并处理。
示例代码
package main
import (
"fmt"
"sync"
)
func main() {
var wg sync.WaitGroup
// 设置需要等待的goroutine数量
wg.Add(3)
// 启动第一个goroutine
go func() {
defer wg.Done()
fmt.Println("goroutine 1 is running")
}()
// 启动第二个goroutine
go func() {
defer wg.Done()
fmt.Println("goroutine 2 is running")
}()
// 启动第三个goroutine
go func() {
defer wg.Done()
fmt.Println("goroutine 3 is running")
}()
// 等待所有goroutine完成
wg.Wait()
fmt.Println("All goroutines have finished")
}
在上述代码中,通过wg.Add(3)
设置了需要等待3个goroutine。每个goroutine在结束前调用wg.Done()
通知WaitGroup
任务已完成。最后通过wg.Wait()
阻塞主线程,直到所有goroutine都调用了wg.Done()
。