面试题答案
一键面试WaitGroup基本结构
WaitGroup
是Go语言标准库sync
包中的一个类型,用于等待一组 goroutine 完成。它内部维护着一个计数器,通过对计数器的操作来实现等待和通知的功能。
常用方法
- Add(delta int):将计数器增加
delta
。一般在启动 goroutine 前调用,delta
通常为1。如果计数器的值变为负数,Add
会导致运行时恐慌。 - Done():将计数器减1。通常在 goroutine 完成任务后调用,等价于
Add(-1)
。 - Wait():阻塞调用者的 goroutine,直到计数器的值变为0。
示例代码
package main
import (
"fmt"
"sync"
"time"
)
func main() {
var wg sync.WaitGroup
// 启动3个goroutine,所以计数器加3
wg.Add(3)
for i := 0; i < 3; i++ {
go func(id int) {
defer wg.Done()
fmt.Printf("Goroutine %d started\n", id)
time.Sleep(time.Second)
fmt.Printf("Goroutine %d finished\n", id)
}(i)
}
// 等待所有goroutine完成
wg.Wait()
fmt.Println("All goroutines have finished")
}
在上述示例中:
- 使用
wg.Add(3)
将WaitGroup
的计数器设置为3,因为要启动3个 goroutine。 - 在每个 goroutine 内部,使用
defer wg.Done()
在函数结束时将计数器减1。 - 主 goroutine 调用
wg.Wait()
等待所有 goroutine 完成(即计数器变为0),然后输出"All goroutines have finished"。