未被“选择”的频道会发生什么?

Kez*_*ong 0 concurrency channel go

根据GOPL,“选择等待直到某些情况的通信准备好继续”,那么未选择的通道会发生什么?此外,向“未选择”通道发送消息的 goroutine 是否会卡住从而导致 goroutine 泄漏?

还是因为“unselected”通道不可达,被GC回收(立即?),卡住的goroutine也被回收?

icz*_*cza 5

未选择的频道将保持“完整”。更准确地说,将不会执行未选择的通信操作。

这是否会导致您的应用程序中出现死锁或 goroutine 泄漏完全取决于您的应用程序。您可能有多个 goroutine 在这些通道上发送/接收,并且select可能在循环中select重复执行,最终执行所有准备好的通信操作。

通道——就像 Go 中的所有值一样——在它们变得不可访问时被垃圾收集,也就是说,没有 Go 代码对它们有“引用”。如果一个 goroutine 被阻塞试图从一个通道发送/接收,这算作对通道的“引用”,因此垃圾收集器无法“挽救”该通道。

垃圾收集器不是解决死锁情况的工具,而是释放无法访问、未使用的内存的工具。必须考虑解决死锁。