channel 上的范围
for s := range cs {
fmt.Println("Recieved Cake: ", s)
}
应该保持函数打开直到 channel 关闭,此时函数/goroutine 应该终止。当函数终止时,延迟函数应该先运行。事实并非如此,我也找不到任何原因。
示例代码位于 http://play.golang.org/p/ADu1MzAe9P按预期生成延迟语句,但从 channel 接收的函数除外。为什么会这样?有什么理由吗?谢谢!
最佳答案
defer 函数不执行的原因是应用程序到达 main
函数的末尾导致整个程序在没有等待 goroutine 的情况下终止。
When the function main returns, the program exits. It does not wait for other (non-main) goroutines to complete.
由于您的 recieveCakeAndPack
仍在等待 channel 关闭(这永远不会发生),因此它永远不会在程序终止之前延迟。
编辑
附带说明 - 将 defer 语句放在函数的最后是没有意义的。而是将它们直接放在您要推迟的语句之后,例如:
fmt.Println("Entering function")
defer fmt.Println("Leaving function")
或
file, err := os.Open("file.txt")
if err != nil {
return err
}
defer file.Close()
延迟函数/方法调用将在以后进先出顺序离开函数时执行。
关于Golang goroutine 不使用 channel 上使用范围的函数延迟运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23379923/