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

Go语言中通过无缓冲channel实现的并行赋值是如何工作的?

Go 并行赋值的执行逻辑

Go 语言规范中明确规定了所有赋值操作(包括短变量声明形式的并行赋值:=)的执行逻辑,分为两个固定阶段:

  • 第一阶段:按照从左到右的顺序,统一完成所有左侧赋值目标的地址计算、所有右侧表达式的结果估值,所有计算得到的临时值会先暂存,不会立刻执行赋值
  • 第二阶段:按照从左到右的顺序,将暂存的右侧结果依次赋值给左侧的对应变量

这个逻辑和你熟悉的 Python 赋值逻辑核心是相似的,所以普通变量交换场景a, b = b, a在 Go 中也可以正常完成交换,不会出现值被提前覆盖的问题。

针对你给出的代码示例中的x, y := <-c, <-c场景,因为右侧的通道接收表达式带有阻塞属性,第一阶段的求值会严格按顺序执行:

  1. 先对第一个右侧表达式<-c求值:这是一个阻塞的通道接收操作,会一直等待直到有 goroutine 向通道c发送值,拿到第一个发送过来的求和结果后,暂存为第一个临时值
  2. 再对第二个右侧表达式<-c求值:继续阻塞等待,直到拿到第二个发送到通道c的求和结果,暂存为第二个临时值
  3. 所有右侧表达式求值完成后,进入第二阶段赋值:将第一个临时值赋值给x,第二个临时值赋值给y

也正是因为这个逻辑,你的示例代码中x和y的取值顺序取决于两个 goroutine 的调度顺序:哪个 goroutine 先把计算结果发送到通道,哪个结果就会被赋值给x,所以输出可能是17 -5 12也可能是-5 17 12,但二者之和永远固定为12。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 08:36:01