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

标签 go

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/

相关文章:

转到文件下载器

go - 通过 gzip 将命令输出通过管道传输到 Reader

json - 是否可以在JSON中创建自定义对象键? [复制]

Go using mux Router - 如何将我的数据库传递给我的处理程序

mysql - 有没有办法创建单名数据库表?

postgresql - Go-Gorm 是否支持在 PostgreSQL 中使用自动递增 ID 插入分区表?

go - 主.go :9: use of package str without selector

database - 如何处理来自数据库的 nil 返回值?

go - 如何在循环外使用模板变量?

goquery:到达另一个元素时停止解析