doudong1117 2019-04-03 19:28
浏览 603
已采纳

调用接受“ 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)
}
  • 写回答

1条回答 默认 最新

  • donjao6770 2019-04-03 19:35
    关注

    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)
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥50 永磁型步进电机PID算法
  • ¥15 sqlite 附加(attach database)加密数据库时,返回26是什么原因呢?
  • ¥88 找成都本地经验丰富懂小程序开发的技术大咖
  • ¥15 如何处理复杂数据表格的除法运算
  • ¥15 如何用stc8h1k08的片子做485数据透传的功能?(关键词-串口)
  • ¥15 有兄弟姐妹会用word插图功能制作类似citespace的图片吗?
  • ¥200 uniapp长期运行卡死问题解决
  • ¥15 latex怎么处理论文引理引用参考文献
  • ¥15 请教:如何用postman调用本地虚拟机区块链接上的合约?
  • ¥15 为什么使用javacv转封装rtsp为rtmp时出现如下问题:[h264 @ 000000004faf7500]no frame?