MST
星途 面试题库

面试题:Go语言中WaitGroup的基本使用

请描述Go语言中WaitGroup的作用是什么?并给出一个简单示例代码,展示如何使用WaitGroup等待多个goroutine完成任务。
45.7万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试

WaitGroup的作用

WaitGroup是Go语言标准库sync包中的一个类型,用于等待一组goroutine完成工作。它提供了一种协调多个goroutine的机制,允许主goroutine(或其他goroutine)等待一组goroutine全部执行完毕后再继续执行。

WaitGroup内部维护一个计数器,通过调用Add方法来设置需要等待的goroutine数量,每个goroutine完成任务后调用Done方法将计数器减1,主goroutine调用Wait方法来阻塞等待,直到计数器归零,即所有goroutine都调用了Done

示例代码

package main

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

func worker(id int, wg *sync.WaitGroup) {
    defer wg.Done()
    fmt.Printf("Worker %d started\n", id)
    time.Sleep(time.Second)
    fmt.Printf("Worker %d finished\n", id)
}

func main() {
    var wg sync.WaitGroup
    numWorkers := 3

    // 设置需要等待的goroutine数量
    wg.Add(numWorkers)

    for i := 1; i <= numWorkers; i++ {
        go worker(i, &wg)
    }

    // 等待所有goroutine完成
    wg.Wait()
    fmt.Println("All workers have finished")
}

在上述代码中:

  1. 定义了一个worker函数,该函数接收一个id和一个指向WaitGroup的指针。在函数结束时调用wg.Done()表示该goroutine已完成任务。
  2. main函数中,创建了一个WaitGroup实例,并通过wg.Add(numWorkers)设置需要等待3个goroutine
  3. 使用for循环启动3个goroutine,每个goroutine执行worker函数。
  4. 最后调用wg.Wait()阻塞主goroutine,直到所有goroutine都调用了Done,即所有worker都完成任务,然后打印All workers have finished