如何创建仅接收频道的频道?

时间:2019-02-20 13:34:09

标签: go channel

我想创建一个通道,例如某人只能从该通道拉出仅接收通道:

c := make(chan <-chan int)

但是,我无法从该频道阅读

invalid operation: <-c (receive from send-only type chan<- chan int)

({Playground link)从错误消息中很明显,我的语法chan <-chan被解释为chan<- chan,即通道的仅发送通道。运行gofmt甚至更改代码以反映这一点。

那我该如何表示想要的频道类型?

2 个答案:

答案 0 :(得分:4)

答案很简单:添加括号。

c := make(chan (<-chan int))

在某些情况下可能更易读的替代方法是为内部通道创建新类型:

type ReceiveOnlyIntChan <-chan int
c := make(chan ReceiveOnlyIntChan)

答案 1 :(得分:4)

如果对于Go的语法尚不清楚,则language specification应该是要检查的第一件事。与其他语言相比,Go的规范更具可读性且更短。

恰好在Spec: Channel types:

中提到了这一点
  

<-运算符可能与最左边的chan相关联:

chan<- chan int    // same as chan<- (chan int)
chan<- <-chan int  // same as chan<- (<-chan int)
<-chan <-chan int  // same as <-chan (<-chan int)
chan (<-chan int)

在这几行引号中,答案很简单

  • 您遇到的原因<-运算符与最左边的chan相关联。
  • 您尝试过的操作的含义chan<- chan intchan<- (chan int)
  • 要实现的目标的解决方案(最后一行):chan (<-chan int)