Go

时间:2017-09-10 13:43:22

标签: go

以下代码采用 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将发送他们的请求并立即退出,不会造成泄漏。

1 个答案:

答案 0 :(得分:2)

显示的代码不会导致泄漏。

如段落所述:

  

我们使用无缓冲的频道

含义:如果我们使用了无缓冲的频道......

因此,只有当通道无缓冲时才会发生泄漏。