go - golang中通道缓冲容量0和1的区别
问题描述
我已将通道缓冲区大小设置为零,例如var intChannelZero = make(chan int)
,当从 获取值时intChannelZero
将被阻止,直到intChannelZero
具有值。
此外,我将通道缓冲区大小设置为 1,例如var intChannelOne = make(chan int, 1)
,当从 获取值时intChannelOne
将被阻止,直到intChannelOne
具有值。
我们知道容量intChannelZero
是零,容量intChannelOne
是一,所以我想知道:
- 给
intChannelZero
like赋值时intChannelZero <- 1
,值保存在哪里? - 为它们赋予价值时以及它们
intChannelZero
之间的差异。intChannelOne
谁能在 Golang Runtime Enviroment 层面解释一下?非常感谢。
解决方案
如果通道没有缓冲(容量为零),则只有在发送方和接收方都准备好时,通信才会成功。
如果通道被缓冲(容量> = 1),则如果通道未满,则发送成功而不会阻塞,如果缓冲区不为空,则接收成功而不会阻塞。
当将值放入 intChannelZero 时,例如 intChannelZero <- 1,该值将保存在哪里?
该值从发送方复制到接收方。除了实现可能使用的任何临时变量之外,该值不会保存在任何地方。
给 intChannelZero 和 intChannelOne 赋值时的区别。
在 intChannelZero 块上发送,直到接收器准备好。
在 intChannelOne 块上发送,直到缓冲区中有可用空间。
推荐阅读
- python - 打开和关闭 Firefox 浏览器的两个实例
- javascript - Node.js - 无法使用 $(this) 从 jquery 访问把手元素
- java - 为什么这个while循环与“and”运算符一起使用而不与“or”一起使用?
- keras - DepthwiseConv2D 和 SeparableConv2D 的区别
- c++11 - 无状态 Lambda 和私有成员
- node.js - 执行 http.get 的 Promise 返回“待处理”
- maven - 仅发布来自一个大项目的某些工件
- ios - 导致 MPNowPlayingInfoCenter 丢失状态的广告横幅
- python - python字典奇怪的行为与dict作为容器
- loopbackjs - 如何在启用 ssl 的情况下将 Loopback 应用程序连接到谷歌数据库?