gpt4 book ai didi

Golang goroutine 不使用 channel 上使用范围的函数延迟运行

转载 作者:IT王子 更新时间:2023-10-29 00:59:54 25 4
gpt4 key购买 nike

channel 上的范围

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

应该保持函数打开直到 channel 关闭,此时函数/goroutine 应该终止。当函数终止时,延迟函数应该先运行。事实并非如此,我也找不到任何原因。

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

最佳答案

defer 函数不执行的原因是应用程序到达 main 函数的末尾导致整个程序在没有等待 goroutine 的情况下终止。

Go Specification说:

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com