MST
星途 面试题库

面试题:Go中WaitGroup在简单并发任务集合场景的应用

假设有一个场景,需要并发执行10个简单的任务(例如打印数字1到10),每个任务是独立的,执行完后主线程要等待所有任务完成才能继续。请使用Go的WaitGroup实现这个功能,并解释WaitGroup相关方法的作用。
12.0万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试
package main

import (
    "fmt"
    "sync"
)

func main() {
    var wg sync.WaitGroup
    for i := 1; i <= 10; i++ {
        wg.Add(1)
        go func(num int) {
            defer wg.Done()
            fmt.Println(num)
        }(i)
    }
    wg.Wait()
    fmt.Println("所有任务完成,主线程继续")
}

WaitGroup相关方法作用

  1. Add(delta int)
    • 作用:向WaitGroup计数器添加指定的增量 delta。在启动每个新的并发任务前,通常调用 Add(1) 来表示增加一个需要等待完成的任务。如果 delta 为负数,会减少计数器的值,但如果计数器的值已经为0,调用 Add 会导致运行时恐慌(panic)。
  2. Done()
    • 作用:标记一个任务已经完成,它等同于 Add(-1)。通常在每个并发任务的函数内部使用 defer wg.Done(),确保无论任务以何种方式结束(正常结束或发生错误),都能正确减少WaitGroup的计数器。
  3. Wait()
    • 作用:阻塞调用它的 goroutine,直到WaitGroup的计数器归零。在主线程中调用 Wait(),主线程会等待所有调用了 Add 且还未调用 Done 的任务完成后,才会继续执行 Wait 之后的代码。