调用接受“ chan interface {}”的函数

时间:2019-04-03 19:28:18

标签: go casting channel

对于对此问题投反对票的人-它确实有一个合理的答案,这是反思(请参阅下文)。

我想创建一个通用函数,可以在其中传递任何通道,它将告诉我其容量已满。我将通道强制转换为“ chan interface {}”感到很烦。

我的问题是,对于下面的函数foo,我可以将字符串传递给它,这很好。 Go接受它作为接口{}。为什么通道的行为不一样?我可以创建一个接受通用chan interface{}的函数吗?

func testFoo() {
    str := "anything"
    foo(str)  //This is fine.
    aChan := make(chan string, 10)

    //This line doesn't compile.  Can I avoid casting to chan interface{}?
    CheckChanLen(aChan) 
}

func foo(obj interface{}) {}

func CheckChanLen(aChan chan interface{}) {
    chanCap := cap(aChan)
    chanLen := len(aChan)
    fmt.Printf("len:%d cap:%d", chanLen, chanCap)
}

1 个答案:

答案 0 :(得分:2)

简短回答:否。

chan interface{}是与interface{}不同的类型。

interface{}是所有类型的包罗万象,而chan interface{}不是所有chan类型的包罗万象。

泛型将带来此功能,但它们不是使用go语言(yet)。


如果您只需要检查信道容量/长度,就可以使用reflect软件包,如下所示:

import "reflect"

func CheckChanLen(aChan interface{}) {
        rv := reflect.ValueOf(aChan)
        if rk := rv.Kind(); rk != reflect.Chan {
                panic("expecting type: 'chan ...'  instead got: " + rk.String())
        }           

        chanCap := rv.Cap()
        chanLen := rv.Len()
        fmt.Printf("len:%d cap:%d\n", chanLen, chanCap)
}