【问题标题】:What's the difference between "<-chan" and "chan" as a function return type?“<-chan”和“chan”作为函数返回类型有什么区别?
【发布时间】:2015-11-02 09:56:48
【问题描述】:

Golang 新手在这里。

两者在功能上有区别吗

func randomNumberGenerator() <-chan int {

func randomNumberGenerator() chan int {

我已经尝试使用这两种方法,它们似乎对我来说都很好。

我在 Google IO 2012 上的 Go Concurrency Patterns 演讲中看到 Rob Pike(Go 的创建者之一)使用的前者。我还在 Go 的官方网站上看到了它。当你可以省略它时,为什么要添加 2 个额外的字符(“

【问题讨论】:

    标签: go channel


    【解决方案1】:

    两者都确实有效。但一个会更受限制。箭头指向远离chan 关键字的表单意味着返回的通道将只能被客户端代码拉出。不允许推送:推送将由随机数生成器函数完成。相反,还有第三种形式,箭头指向chan,这使得所述频道对客户端只写。

    chan   // read-write
    <-chan // read only
    chan<- // write only
    

    这些添加的约束可以改善意图的表达并收紧类型系统:尝试将内容强制进入只读通道会导致编译错误,因此会尝试从只写通道读取。这些约束可以在返回类型中表示,但它们也可以是参数签名的一部分。喜欢在:

    func log(<-chan string) { ...
    

    您可以通过签名知道log 函数将使用通道中的数据,而不向其发送任何数据。

    【讨论】:

    • 谢谢。 func log(&lt;-chan string)不应该有像func log(cs &lt;- chan string)这样可以在函数中使用的参数名称吗?
    【解决方案2】:

    这是receive-only channel 的示例。

    可选的&lt;- 运算符指定通道方向,发送或接收。如果没有给出方向,则通道是双向的。通道可能被限制为仅发送或仅通过转换或分配接收。

    告诉 API 的用户他们应该从该通道接收并且从不发送是很有用的,否则会发生不好的事情。在公共 API 中指定频道的方向被认为是一种很好的做法。另见:Principles of designing Go APIs with channels

    【讨论】:

    • 这不仅仅是“用户不应该发送否则会发生坏事”。 AFAIK,试图发送只会让编译器直接对你生气。
    猜你喜欢
    • 2019-06-22
    • 1970-01-01
    • 2014-06-07
    • 2018-05-10
    • 1970-01-01
    • 2021-11-16
    • 2013-09-19
    • 2015-08-31
    • 2019-05-31
    相关资源
    最近更新 更多