对于对此问题投反对票的人-它确实有一个合理的答案,这是反思(请参阅下文)。
我想创建一个通用函数,可以在其中传递任何通道,它将告诉我其容量已满。我不得不将频道强制转换为“ 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)
}
简短的回答:不。
chan interface{}
与的类型不同interface{}
。
interface{}
是一个包罗万象的所有类型,但是chan interface{}
是不是一个包罗万象的所有chan
类型。
泛型会带来这种能力,但他们不是在Go语言(但)。
如果您需要做的只是检查信道容量/长度,则可以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)
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句