Go语言中不保存接收结果的通道读取操作(如<-doneC)的作用是什么?
Go语言无接收变量通道操作
<-doneC的作用 这种写法是Go并发编程中最常用的信号等待/同步控制模式,你给出的示例代码中这个操作的逻辑如下:
rest.XReceive返回的doneC是一个信号通道,通常为chan struct{}类型(空结构体不占用内存空间,仅用作信号传递),由内部异步执行的goroutine持有- 代码执行到
<-doneC时会阻塞当前goroutine,直到以下两种情况之一发生才会继续往下走:- 持有
doneC的内部goroutine执行完任务后,向doneC发送了信号值 - 持有
doneC的内部goroutine执行完任务后,直接关闭了doneC
- 持有
- 因为这里只需要知道「异步任务已经完成」这个事件本身,不需要获取通道传递的具体内容,所以不需要定义变量存储接收结果
常见的同类使用场景还有:
- 等待多个goroutine全部执行完成(可以替代
sync.WaitGroup的部分场景) - 监听程序退出信号,阻塞主goroutine防止程序直接退出
- 实现定时器、超时控制的阻塞等待逻辑
如果你碰到的
doneC是带缓冲的通道,这种写法也可以用来消费掉通道中多余的信号,避免通道阻塞影响其他逻辑
内容的提问来源于stack exchange,提问作者the_big_blackbox
相关产品推荐
相关产品推荐

