如何在没有隐式缓冲区的情况下将值从一个Go通道传输到另一个通道?

时间:2018-07-18 06:27:58

标签: go pipeline channel

想象一下,我有一个goroutine,它从一个通道读取并写入另一个通道。

ch1 := make(chan int)
ch2 := make(chan int)
go func() {
  for num := range ch1 {
    ch2 <- num+1
  }
}()

如果ch2被阻止,goroutine仍将从ch1读取一个值,从而在通道中有效地引入了1的缓冲区。由于我将通道用于控制流,因此我不需要任何缓冲。

如何制作以完全锁步方式执行的管道? 或者换种说法,如何在一个原子操作中将值从一个通道转移到下一个通道?

我基本上想等待ch1ch2都在集合点。

1 个答案:

答案 0 :(得分:1)

您不能使用2个频道进行此操作。为了在ch2上执行发送,要发送的值必须已经准备好,已评估。 Spec: Send statements:

  

在开始通信之前先评估通道和值表达式。

因此,即使您这样做,似乎也不会在任何变量中缓冲该值:

ch2 <- (<- ch1)

仍然,将首先评估来自ch1的接收,然后才尝试发送。

这意味着必须已经从ch1接收到值。但是您无法确定是否有人在ch2上“监听”(意味着是否可以继续进行ch2的发送)而没有尝试发送ch2(即使可以的话)无法保证检查后尝试发送仍会有人在听。)