MST

星途 面试题库

面试题:Go中WaitGroup如何在并发任务计数场景中应用

假设有多个Go协程并发执行一些任务,例如每个协程模拟一个网络请求并返回结果,最后需要等待所有协程完成任务后汇总结果。请用Go语言代码实现这个场景,要求使用WaitGroup,并简要解释代码中WaitGroup的各个方法(Add、Done、Wait)的作用。
21.7万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试
package main

import (
    "fmt"
    "sync"
)

func main() {
    var wg sync.WaitGroup
    results := make([]int, 3)

    // 模拟3个网络请求
    for i := 0; i < 3; i++ {
        wg.Add(1)
        go func(index int) {
            defer wg.Done()
            // 模拟网络请求
            result := index * 2
            results[index] = result
        }(i)
    }

    wg.Wait()
    fmt.Println("汇总结果:", results)
}
  • Add方法:用于向WaitGroup添加指定数量的任务,即告诉WaitGroup有多少个协程需要等待。在上述代码中,wg.Add(1)表示每个新的协程开始时,增加一个等待的任务。
  • Done方法:当一个协程完成任务后,调用Done方法,它等同于Add(-1),即减少WaitGroup中等待的任务数量。在上述代码中,defer wg.Done()确保在协程结束时,无论是否发生错误,都会减少等待的任务数。
  • Wait方法:调用Wait方法的协程会阻塞,直到WaitGroup中等待的任务数量降为0,即所有相关协程都调用了Done方法。在上述代码中,wg.Wait()使主协程等待所有模拟网络请求的协程完成任务后,再继续执行后续代码。