MST

星途 面试题库

面试题:Go中WaitGroup在并发控制中的基本用法

请描述Go语言中WaitGroup的基本结构和常用方法,并且通过一个简单示例说明如何使用WaitGroup等待一组并发任务完成。
37.9万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试

WaitGroup基本结构

WaitGroup是Go语言标准库sync包中的一个类型,用于等待一组 goroutine 完成。它内部维护着一个计数器,通过对计数器的操作来实现等待和通知的功能。

常用方法

  1. Add(delta int):将计数器增加delta。一般在启动 goroutine 前调用,delta通常为1。如果计数器的值变为负数,Add会导致运行时恐慌。
  2. Done():将计数器减1。通常在 goroutine 完成任务后调用,等价于Add(-1)
  3. 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")
}

在上述示例中:

  1. 使用wg.Add(3)WaitGroup的计数器设置为3,因为要启动3个 goroutine。
  2. 在每个 goroutine 内部,使用defer wg.Done()在函数结束时将计数器减1。
  3. 主 goroutine 调用wg.Wait()等待所有 goroutine 完成(即计数器变为0),然后输出"All goroutines have finished"。