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

报告相同问题?

悬赏问题

  • ¥15 用三极管设计—个共射极放大电路
  • ¥15 请完成下列相关问题!
  • ¥15 drone 推送镜像时候 purge: true 推送完毕后没有删除对应的镜像,手动拷贝到服务器执行结果正确在样才能让指令自动执行成功删除对应镜像,如何解决?
  • ¥15 求daily translation(DT)偏差订正方法的代码
  • ¥15 js调用html页面需要隐藏某个按钮
  • ¥15 ads仿真结果在圆图上是怎么读数的
  • ¥20 Cotex M3的调试和程序执行方式是什么样的?
  • ¥20 java项目连接sqlserver时报ssl相关错误
  • ¥15 一道python难题3
  • ¥15 牛顿斯科特系数表表示