我正在閱讀“Go 中的并發(fā)”,并發(fā)現(xiàn)了這個(gè) 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永遠(yuǎn)不會(huì)寫(xiě)入任何字符串,并且包含的 goroutinedoWork將在進(jìn)程的生命周期內(nèi)保留在內(nèi)存中。我不明白 - 為什么?我如何理解這段代碼:原樣-loop 剛剛strings被nil range跳過(guò)。當(dāng)任何范圍超過(guò)nil:slice := []int{10, 20, 30, 40, 50}slice = nilfor i := range slice { fmt.Println(i)}fmt.Println("Done")fmt.Println("doWork exited.")將被處決close(completed)將被處決但我看到它是這樣工作的。為什么 ?
為什么這個(gè) goroutine 會(huì)泄漏?
幕布斯7119047
2023-07-10 10:50:28