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)
}