Golang goroutine没有使用在频道上使用范围的功能延迟

时间:2014-04-30 04:53:44

标签: go

频道上的范围

for s := range cs {
    fmt.Println("Recieved Cake: ", s)
}

应该保持一个函数打开,直到通道关闭,此时函数/ goroutine应该终止。当函数终止时,延迟函数应该在之前运行。这似乎并非如此,我找不到任何理由。

http://play.golang.org/p/ADu1MzAe9P处的示例代码按预期生成延迟语句,但从通道接收的函数除外。有什么理由为什么会这样?谢谢!

1 个答案:

答案 0 :(得分:5)

延迟函数未执行的原因是应用程序到达main函数的末尾,导致整个程序终止而不等待goroutines。

Go Specification说:

  

当函数main返回时,程序退出。它不会等待其他(非主要)goroutines完成。

由于您的recieveCakeAndPack仍在等待频道关闭(从未发生),因此在节目终止之前永远不会推迟。

修改

另一方面 - 将延迟语句最后放在函数中是没有意义的。而是将它们直接放在要延迟的语句之后,例如:

fmt.Println("Entering function")
defer fmt.Println("Leaving function")

file, err := os.Open("file.txt")
if err != nil {
    return err
}
defer file.Close()

当以后进先出顺序退出函数时,将执行延迟函数/方法调用。