You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Go语言中如何等待goroutine执行完成后再执行后续函数

确保B()在print执行完成后调用的几种方法

针对你的代码场景,要让B()仅在print("hello")执行完成后再调用,有以下几种常用方案:

方案一:使用sync.WaitGroup

这是Go中等待goroutine完成的标准方式,适合需要等待一个或多个goroutine的场景:

import "sync"

func A(wg *sync.WaitGroup) {
    defer wg.Done() // goroutine执行完后标记完成
    print("hello")
}

func main() {
    var wg sync.WaitGroup
    wg.Add(1) // 声明要等待1个goroutine
    go A(&wg) // 启动goroutine
    wg.Wait() // 阻塞直到所有等待的goroutine完成
    B()
}

原理:WaitGroup通过计数跟踪未完成的goroutine,Add()设置初始计数,Done()将计数减1,Wait()会一直阻塞直到计数归0,保证B()在print执行完后才运行。

方案二:使用Channel传递完成信号

如果只需要等待单个goroutine,用channel传递信号也很简洁:

func A(ch chan struct{}) {
    print("hello")
    close(ch) // 执行完成后关闭channel发送信号
}

func main() {
    ch := make(chan struct{})
    go A(ch)
    <-ch // 阻塞直到收到channel的信号
    B()
}

原理:struct{}是不占用内存的空类型,适合做信号载体。goroutine执行完print后关闭channel,main函数里的<-ch会一直阻塞,直到channel被关闭或收到值,之后才会调用B()。

方案三:同步执行(无需goroutine)

如果不需要并发执行print,直接去掉go关键字,让A()同步执行:

func A() {
    print("hello")
}

func main() {
    A()
    B()
}

这种情况下A()执行完print后才会返回,自然能保证B()在之后运行。

内容的提问来源于stack exchange,提问作者user1028741

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 15:02:08