不是 "selected" 的频道会怎样?

What happens to the channels that are not "selected"?

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

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

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

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

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

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