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

Golang中无缓冲通道(容量0)与容量1缓冲通道的差异问询

关于Go语言通道通信的问题解答

问题1:「收发双方均就绪」具体指什么?是否存在先后顺序,是否必须接收方先就绪?

  • 「收发双方均就绪」指的是:发送方的goroutine已经执行到ch <- 值语句,进入等待发送的阻塞状态;接收方的goroutine已经执行到<- ch或val := <- ch语句,进入等待接收的阻塞状态。只有两者都到达对应通道操作语句并处于等待状态时,无缓冲通道的通信才能完成。
  • 不存在固定先后顺序,也无需接收方先就绪:不管是发送方先执行到发送语句并阻塞,还是接收方先执行到接收语句并阻塞,只要另一方也到达对应通道操作语句,通信就会立刻完成,双方解除阻塞继续执行后续代码。

问题2:通道容量为3时,ch <- "C"下方的代码是否仍会运行?

结果取决于通道当前已存元素的数量:

  • 如果通道内元素少于3个(还有空闲缓冲位),执行ch <- "C"后发送方goroutine不会阻塞,下方代码会正常运行。
  • 如果通道内已有3个元素(通道已满),执行ch <- "C"时发送方会被阻塞,下方代码要等到其他goroutine从通道接收元素、腾出缓冲位后,才能继续运行。

问题3:容量为0时发送方下方代码是否不会运行,而容量为1时即使通道满了发送方下方代码仍可运行?

这个说法不准确:

  • 容量为0(无缓冲通道):发送方执行ch <- 值后会立即阻塞,必须等接收方完成接收操作、通信结束后,才能继续执行下方代码,因此通信完成前下方代码确实不会运行。
  • 容量为1(缓冲通道):当通道已满时,发送方执行ch <- 值会被阻塞,此时下方代码同样不会运行,直到有接收方取走通道内元素、腾出位置,发送操作完成后才能继续执行。只有当通道为空时,发送方发送元素后不会阻塞,下方代码才会立刻运行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 01:12:57