我想创建一个频道,某人只能从中获取只接收频道,例如:
c := make(chan <-chan int)
但是,我无法从这个频道阅读:
invalid operation: <-c (receive from send-only type chan<- chan int)
(Playground link)从错误消息中可以清楚地看出,我的语法chan <-chan
被解释为chan<- chan
,即通道的仅发送通道。运行gofmt
甚至更改代码以反映这一点。
那么我该如何表示我想要的频道类型呢?
如果对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 int
答案很简单:添加括号。
chan<- (chan int)
在某些情况下可能更具可读性的替代方法是为内部通道创建一个新类型:
chan (<-chan int)