首页 >后端开发 >Golang >如何在不读取 Go Channel 的情况下检查它是否已关闭?

如何在不读取 Go Channel 的情况下检查它是否已关闭?

Barbara Streisand
Barbara Streisand原创
2024-11-14 16:11:02897浏览

How to Check if a Go Channel is Closed Without Reading from It?

如何在不读取通道的情况下检查通道是否关闭?

在 Go 中使用通道时会出现这个问题,此时必须确定通道关闭而不阻塞。在提供的代码示例中,希望在相应的工作进程退出时从切片中删除通道。

问题

在worker() while 中关闭通道尝试在controller()中写入它会导致恐慌。使用互斥锁来保护此操作会导致死锁。为通道分配更大的缓冲区也不是一个可行的解决方案。

建议的解决方案

要解决此问题,建议worker() 在以下情况下关闭通道它退出了。然后,controller() 可以检查关闭的通道并跳过对它们的写入。然而,目前 Go 中没有内置函数可以在不读取通道的情况下检查通道关闭情况。

可能的解决方法

  • 紧急恢复: 虽然不理想,但可以通过尝试写入通道并恢复引发的恐慌来粗暴地检查通道关闭情况。但是,这种方法不适用于读取通道。
  • 使用指示器读取通道:使用 v, ok :=

以上是如何在不读取 Go Channel 的情况下检查它是否已关闭?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn