我正在阅读“Go 中的并发”,并发现了这个 goroutine 泄漏的示例:
func main() {
var wg sync.WaitGroup
doWork := func(strings <-chan string) <-chan interface{} {
completed := make(chan interface{})
go func() {
defer fmt.Println("doWork exited.")
defer close(completed)
defer wg.Done()
fmt.Println("a")
for s := range strings {
fmt.Println(s)
}
fmt.Println("b")
}()
return completed
}
wg.Add(1)
doWork(nil)
fmt.Println("Waiting")
wg.Wait()
fmt.Println("Done.")
}
通道strings永远不会写入任何字符串,并且包含的 goroutinedoWork将在进程的生命周期内保留在内存中。
我不明白 - 为什么?
我如何理解这段代码:
原样-loop 刚刚strings被nil range跳过。当任何范围超过nil:
slice := []int{10, 20, 30, 40, 50}
slice = nil
for i := range slice {
fmt.Println(i)
}
fmt.Println("Done")
fmt.Println("doWork exited.")将被处决
close(completed)将被处决
但我看到它是这样工作的。为什么 ?
慕斯王
相关分类