首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何创建一个只接收频道?

如何创建一个只接收频道?
EN

Stack Overflow用户
提问于 2019-02-20 13:34:09
回答 2查看 374关注 0票数 0

例如,我希望创建一个只能从其中提取接收通道的通道:

代码语言:javascript
运行
复制
c := make(chan <-chan int)

然而,我无法从这个频道读到:

代码语言:javascript
运行
复制
invalid operation: <-c (receive from send-only type chan<- chan int)

(操场链接)从错误消息中可以清楚地看到,我的语法chan <-chan被解释为chan<- chan,即一个只发送通道的通道。运行gofmt甚至会更改代码以反映这一点。

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-02-20 16:26:09

如果对Go的语法有什么不清楚的地方,应该首先检查语言规范。与其他语言相比,Go的规范更易读、更短。

这正是在规格:频道类型:中提到的

<-运算符与最左边的chan可能关联: chan <- chan int /同为chan<- (chan int) chan<- <-chan int /同为chan <- chan int /同为<-chan int (<-chan int) chan (<-chan int)

答案是,在这几行引文中,答案是清晰而简单的。

  • 您所经历的原因<-操作符与最左边的chan可能相关联。
  • 意思是您尝试过的内容的chan<- chan intchan<- (chan int)相同
  • 解决方案到您想要实现的目标(最后一行):chan (<-chan int)
票数 3
EN

Stack Overflow用户

发布于 2019-02-20 13:34:09

答案很简单:添加括号。

代码语言:javascript
运行
复制
c := make(chan (<-chan int))

在某些情况下,另一种更易读的方法是为内部通道创建一个新类型:

代码语言:javascript
运行
复制
type ReceiveOnlyIntChan <-chan int
c := make(chan ReceiveOnlyIntChan)
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54787581

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档