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

问题描述 投票:0回答:2

我想创建一个频道,某人只能从中获取只接收频道,例如:

c := make(chan <-chan int)

但是,我无法从这个频道阅读:

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

Playground link)从错误消息中可以清楚地看出,我的语法chan <-chan被解释为chan<- chan,即通道的仅发送通道。运行gofmt甚至更改代码以反映这一点。

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

go channel
2个回答
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)

在这些引用的几行中,答案是明确而简单的。

  • 你经历的原因:与最左边的qazxsw poi相关的qazxsw poi算子可能。
  • 您尝试过的含义:<-chan相同
  • 你想要达到的目标的解决方案(最后一行):chan<- chan int

4
投票

答案很简单:添加括号。

chan<- (chan int)

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

chan (<-chan int)
© www.soinside.com 2019 - 2024. All rights reserved.