MST

星途 面试题库

面试题:Go中如何使用sync.WaitGroup实现并发控制

假设有多个goroutine同时执行一些任务,例如每个goroutine模拟一个网络请求操作,你需要使用sync.WaitGroup确保所有的goroutine都执行完毕后再继续主程序的后续逻辑。请编写一个Go语言示例代码来实现这一功能,并简要解释sync.WaitGroup的关键方法的作用。
15.8万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试
package main

import (
    "fmt"
    "sync"
    "time"
)

func main() {
    var wg sync.WaitGroup
    numGoroutines := 5

    // Add 方法设置 WaitGroup 要等待的 goroutine 数量
    wg.Add(numGoroutines)

    for i := 0; i < numGoroutines; i++ {
        go func(id int) {
            // 模拟网络请求操作
            defer wg.Done() // Done 方法表示一个 goroutine 已经完成任务
            fmt.Printf("Goroutine %d is working\n", id)
            time.Sleep(time.Second)
        }(i)
    }

    // Wait 方法阻塞当前 goroutine,直到所有 goroutine 都调用了 Done 方法
    wg.Wait()
    fmt.Println("All goroutines have finished")
}

sync.WaitGroup 关键方法作用

  1. Add(delta int):设置 WaitGroup 要等待的 goroutine 数量。delta 为正数表示新增要等待的 goroutine 数量,负数表示减少等待的 goroutine 数量(但一般不建议使用负数,因为容易造成逻辑混乱)。
  2. Done():表示一个 goroutine 已经完成任务,等价于 wg.Add(-1),一般在 defer 中调用,确保即使函数提前返回也能正确标记任务完成。
  3. Wait():阻塞当前 goroutine,直到所有通过 Add 方法设置的要等待的 goroutine 都调用了 Done 方法,即等待计数归零。