我已将通道缓冲区大小设置为零,例如var intChannelZero = make(chan int)
,当从intChannelZero
获取值时将被阻塞,直到intChannelZero
具有值为止。
此外,我将通道缓冲区的大小设置为1,例如var intChannelOne = make(chan int, 1)
,当从intChannelOne
获取值时将被阻塞,直到intChannelOne
具有值为止。
我们知道intChannelZero
的容量为零,intChannelOne
的容量为1,所以我想知道:
intChannelZero
之类的intChannelZero <- 1
时,该值保存在哪里? intChannelZero
和intChannelOne
赋值时的区别。谁可以在Golang运行时环境级别上解释它?非常感谢。
答案 0 :(得分:4)
如果通道未缓冲(容量为零),则只有在发送方和接收方都准备就绪时,通信才能成功。
如果通道已缓冲(容量> = 1),则如果通道未满,则发送成功而不会阻塞;如果缓冲区不为空,则接收会成功而不会阻塞。
像intChannelZero <-1一样将值放入intChannelZero时,将值保存在哪里?
该值从发送方复制到接收方。该值不会保存在实现可能使用的任何临时变量以外的任何地方。
将intChannelZero和intChannelOne赋值时的区别。
在intChannelZero块上发送,直到接收器准备就绪为止。
在intChannelOne块上发送,直到缓冲区中有可用空间为止。
答案 1 :(得分:0)
未缓冲和缓冲的通道差异都将是
用于无缓冲通道
如果该频道已发送消息但尚未收到,则发送将被阻止。
如果没有发送过,接收将被阻止。
用于缓冲的频道
如果已经发生n(通道大小)发送并且没有接收到发送,则发送将被阻止。即,整个通道大小已被消息发送使用,但未收到任何消息。
如果缓冲区为空,即没有任何未使用的发送,则接收将被阻止
运行时错误
接收被阻止将引发以下错误
fatal error: all goroutines are asleep - deadlock!
goroutine 1 [chan receive]:
阻止发送将引发以下错误
fatal error: all goroutines are asleep - deadlock!
goroutine 1 [chan send]: