我想创建一个通道,例如某人只能从该通道拉出仅接收通道:
c := make(chan <-chan int)
但是,我无法从该频道阅读
invalid operation: <-c (receive from send-only type chan<- chan int)
({Playground link)从错误消息中很明显,我的语法chan <-chan
被解释为chan<- chan
,即通道的仅发送通道。运行gofmt
甚至更改代码以反映这一点。
那我该如何表示想要的频道类型?
答案 0 :(得分:4)
答案很简单:添加括号。
c := make(chan (<-chan int))
在某些情况下可能更易读的替代方法是为内部通道创建新类型:
type ReceiveOnlyIntChan <-chan int
c := make(chan ReceiveOnlyIntChan)
答案 1 :(得分:4)
如果对于Go的语法尚不清楚,则language specification应该是要检查的第一件事。与其他语言相比,Go的规范更具可读性且更短。
中提到了这一点
<-
运算符可能与最左边的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)