go - golang中的无类型频道
问题描述
我正在写一些包,其中通道仅用于中断某些进程,因此它永远不会读取任何值,只是检测到它需要停止,如下所示:
func myfunc(stop_chan chan /*bool*/) {
for {
//do something time consuming
// ....
// check on channel
select{
case <-stop_chan:
//cleanup
return
default:
}
// continue working
}
}
后来我希望这个函数能够接受任何类型的频道。那可能吗?
解决方案
我希望这个功能能够接受任何类型的频道。那可能吗?
不,这是不可能的。Go 中没有无类型的通道。您可以接受任何类型的通道,使用interface{}
,然后使用反射与该通道进行交互。但是这样既麻烦又慢,所以不推荐。
更好的方法可能是选择单一类型的通道(chan struct{}
这是您的用例的自然选择),或者使用context
变量来代替,它可以以标准化的方式处理取消。
推荐阅读
- sql-server - 如何合并从两个查询创建的两个列表
- c - 没有内核模块的 PCIe DMA 进入系统内存
- pytorch - 改变类数时CNN不分类
- java - 为什么我会收到此休眠错误:HHH000346:托管刷新期间出错 [getPersistenceContext 在没有活动事务的情况下无效]
- android - getParentFragmentManager 视图找不到 id upPlayerlin 并在 firebase 中崩溃
- python - 如何将 psd Photoshop 文件的元数据字段值读入 Python?
- html - 如何将文本放入进度条中?
- php - Laravel 7 或与和混合的地方
- malloc - D语言中使用malloc的问题:为什么writeln在这个例子中调用了两次析构函数
- jquery - 鼠标悬停时如何更改 li 图像,我使用 .load 检索图像