首页 > 解决方案 > golang中的无类型频道

问题描述

我正在写一些包,其中通道仅用于中断某些进程,因此它永远不会读取任何值,只是检测到它需要停止,如下所示:

func myfunc(stop_chan chan /*bool*/) {
  for {
    //do something time consuming
    // ....
    // check on channel
    select{
      case <-stop_chan:
        //cleanup
        return
      default:
    }
    // continue working
  }
}

后来我希望这个函数能够接受任何类型的频道。那可能吗?

标签: gochanneluntyped-variables

解决方案


我希望这个功能能够接受任何类型的频道。那可能吗?

不,这是不可能的。Go 中没有无类型的通道。您可以接受任何类型的通道,使用interface{},然后使用反射与该通道进行交互。但是这样既麻烦又慢,所以不推荐。

更好的方法可能是选择单一类型的通道(chan struct{}这是您的用例的自然选择),或者使用context变量来代替,它可以以标准化的方式处理取消。


推荐阅读