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
相关产品推荐
相关产品推荐

