想象一下以下代码:
func waitForOneOfTwoProcesses() {
c := make(chan bool)
go func() {
time.Sleep(1 * time.Second)
c<-true
}()
go func() {
time.Sleep(2 * time.Second)
c<-true
}()
<-c
}
这会泄漏一个频道和goroutine,还是Go认识到c
已经消失且goroutine可以退出?
如果频道的缓冲区大小为2,答案是否会有所不同?
答案 0 :(得分:4)
如果频道未缓冲,则其中一个匿名函数将不会返回。该程序泄漏了goroutine和频道。
如果通道的缓冲区大小大于或等于1,则两个匿名函数都将返回。 goroutines和channel使用的资源将被回收。
缓冲区大小为1足以防止泄漏。函数waitForOneOfTwoProcesses
会收到发送到c
的其中一个值。发送到c
的第二个值在通道中缓冲(由GC收集)。
确保goroutines返回的另一种方法是使用非阻塞发送。将c <- true
行替换为:
select {
case c <- true:
default:
}