以下代码采用 The Go Programming Language
func mirroredQuery() string {
responses := make(chan string, 3)
go func() { responses <- request("asia.gopl.io") }()
go func() { responses <- request("europe.gopl.io") }()
go func() { responses <- request("americas.gopl.io") }()
return <-responses // return the quickest response
}
func request(hostname string) (response string) { /* ... */ }
书上写着
如果我们使用了无缓冲的通道,那么速度会慢一些 goroutines会因试图发送回复而陷入困境 在没有goroutine将会收到的频道上。这种情况称为goroutine泄漏,将是一个错误。与垃圾不同 变量,泄漏的goroutine不会自动收集,所以 确保goroutines自行终止是很重要的 什么时候不再需要。
问题就是为什么这种情况会导致goroutine
泄漏。在我的想法中,缓冲频道的cap
为3,而goroutines
将发送他们的请求并立即退出,不会造成泄漏。
答案 0 :(得分:2)
显示的代码不会导致泄漏。
如段落所述:
我们使用无缓冲的频道
含义:如果我们使用了无缓冲的频道......
因此,只有当通道无缓冲时才会发生泄漏。