登录
首页 >  Golang >  Go问答

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

来源:stackoverflow

时间:2024-04-25 18:42:34 236浏览 收藏

目前golang学习网上已经有很多关于Golang的文章了,自己在初次阅读这些文章中,也见识到了很多学习思路;那么本文《如何创建仅接收频道的频道?》,也希望能帮助到大家,如果阅读完后真的对你学习Golang有帮助,欢迎动动手指,评论留言并分享~

问题内容

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

c := make(chan <-chan int)

但是,我无法从此频道读取内容:

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

(演示链接)从错误消息中可以清楚地看出,我的语法 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 intchan<- (chan int) 相同
  • 您想要实现的目标的解决方案(最后一行):chan (<-chan int)

答案很简单:添加括号。

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

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

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

文中关于的知识介绍,希望对你的学习有所帮助!若是受益匪浅,那就动动鼠标收藏这篇《如何创建仅接收频道的频道?》文章吧,也可关注golang学习网公众号了解相关技术文章。

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>