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

To the people who down voted this question - it does have a legitimate answer, which is reflection (see below).

I want to create a generic function where I can pass any channel to it and it will tell me how much of its capacity is filled. I'm finding it annoying that I have to cast the channel to "chan interface{}".

My question is, for the function foo below, I can pass a string to it and that's fine. Go accepts that as an interface{}. Why does it not behave the same for channels? Can I create a function which accepts a generic 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)
}

Short answer: no.

chan interface{} is a different type to interface{}.

interface{} is a catch-all for all types, but chan interface{} is NOT a catch-all for all chan types.

Generics will bring this capability, but they are not in the go language (yet).


If all you need to do is check for channel capacity/length you can use the reflect package like so:

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
", chanLen, chanCap)
}