【问题标题】:go: how to pass directional channels to a function accepting bidirectional channel?go: 如何将定向通道传递给接受双向通道的函数?
【发布时间】:2015-02-17 03:25:08
【问题描述】:

您好有一个接受chan []byte 的函数(因为没有指定方向,我理解它是双向的)。该函数不发送或接收任何内容,仅查看通道中的元素数量以用于统计相关目的。

我想在具有以下签名的函数中调用此函数:

func foo(fooChannel chan<- []byte)

但是当我尝试使用参数来调用另一个函数时,我收到了错误cannot use fooChannel (type &lt;-chan []byte) as type chan []byte in function argument

有没有办法将 fooChannel 转换为 chan []byte

由于我只对获取一些统计数据感兴趣,我应该如何对函数进行原型设计以接受任何类型的通道(这样我什至可以摆脱“字节”部分)?我只使用lencap 将频道作为参数接收。

【问题讨论】:

    标签: go


    【解决方案1】:

    改写一下:

    “有没有办法将定向频道投射到非定向频道?”不,没有。

    “Go 中有‘任意通道’(没有元素类型)的概念吗?”不,没有。 Go 没有泛型。

    你必须编写几个函数。

    【讨论】:

    • 将 len(ch) 和 cap(ch) 值传递给您的 stats 函数
    【解决方案2】:

    有没有办法将 fooChannel 转换为 chan []byte?

    不,对不起。这可能只是以防万一有人认为他们无论如何都想在接收通道上发送。但是,只是一点点小东西,但是……不。

    该函数不发送或接收任何内容,仅查看通道中的元素数量以用于统计相关目的。 [...] 我只使用 lencap 将频道作为参数接收。

    如果它不以任何通道方式使用通道,您可以简单地将 len(ch)cap(ch) 作为参数直接传递。如果您出于任何原因不喜欢它,您可以使用reflect 包,它允许您在任何支持它的类型(数组、通道、切片)上调用lencap

    这可能是一个好的开始:

    package main
    
    import (
        "fmt"
        "reflect"
    )
    
    func stats(i interface{}) {
        v := reflect.ValueOf(i)
        fmt.Printf("%s size: %d/%d\n", v.Kind(), v.Len(), v.Cap())
    }
    
    func main() {
        ch := make(chan int, 10)
        ch <- 1
        stats(ch)
    }
    
    // Output: chan size: 1/10
    

    http://play.golang.org/p/2ehYvEmDkS

    【讨论】:

      猜你喜欢
      • 2016-04-11
      • 2018-06-17
      • 2014-05-02
      • 2016-04-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-03
      • 1970-01-01
      相关资源
      最近更新 更多