Golang中通道缓冲容量0和1之间的差异

时间:2018-11-17 04:25:11

标签: go

我已将通道缓冲区大小设置为零,例如var intChannelZero = make(chan int),当从intChannelZero获取值时将被阻塞,直到intChannelZero具有值为止。

此外,我将通道缓冲区的大小设置为1,例如var intChannelOne = make(chan int, 1),当从intChannelOne获取值时将被阻塞,直到intChannelOne具有值为止。

我们知道intChannelZero的容量为零,intChannelOne的容量为1,所以我想知道:

  • 在将值保存到intChannelZero之类的intChannelZero <- 1时,该值保存在哪里?
  • intChannelZerointChannelOne赋值时的区别。

谁可以在Golang运行时环境级别上解释它?非常感谢。

2 个答案:

答案 0 :(得分:4)

如果通道未缓冲(容量为零),则只有在发送方和接收方都准备就绪时,通信才能成功。

如果通道已缓冲(容量> = 1),则如果通道未满,则发送成功而不会阻塞;如果缓冲区不为空,则接收会成功而不会阻塞。

  

像intChannelZero <-1一样将值放入intChannelZero时,将值保存在哪里?

该值从发送方复制到接收方。该值不会保存在实现可能使用的任何临时变量以外的任何地方。

  

将intChannelZero和intChannelOne赋值时的区别。

在intChannelZero块上发送,直到接收器准备就绪为止。

在intChannelOne块上发送,直到缓冲区中有可用空间为止。

答案 1 :(得分:0)

未缓冲和缓冲的通道差异都将是

  1. 发送到频道被阻止
  2. 从频道接收的邮件被阻止

用于无缓冲通道

如果该频道已发送消息但尚未收到,则发送将被阻止。

如果没有发送过,接收将被阻止。

用于缓冲的频道

如果已经发生n(通道大小)发送并且没有接收到发送,则发送将被阻止。即,整个通道大小已被消息发送使用,但未收到任何消息。

如果缓冲区为空,即没有任何未使用的发送,则接收将被阻止

运行时错误

接收被阻止将引发以下错误

fatal error: all goroutines are asleep - deadlock!

goroutine 1 [chan receive]:

阻止发送将引发以下错误

fatal error: all goroutines are asleep - deadlock!

goroutine 1 [chan send]: