想象一下下面的代码:
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,答案会有所不同吗?
如果通道未缓冲,则匿名函数之一将不会返回。该程序泄漏了 goroutine 和通道。
如果通道的缓冲区大小大于或等于 1,则两个匿名函数都将返回。 Goroutines 和 Channel 使用的资源将被回收。
缓冲区大小为 1 足以防止泄漏。功能waitForOneOfTwoProcesses
接收发送到的值之一c
。第二个值发送到c
缓冲在通道中(由GC收集)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)