go - 为什么 golang "defer"的范围是函数,而不是词法封闭

标签 go

我惊讶地发现这两个程序产生相同的输出:

程序A

package main
import "fmt"

func main() {  
    defer fmt.Println(1)
    defer fmt.Println(2)
}

方案B

package main
import "fmt"

func main() {  
    {
        defer fmt.Println(1)
    }
    defer fmt.Println(2)
}

换句话说,“defer”语句似乎忽略了词法闭包[编辑:感谢@twotwotwo 纠正了我的术语,我的意思是说“ block ”而不是“词法闭包”]并且严格限制在函数范围内。我想知道:

  1. 我的理解正确吗?
  2. 有没有办法将它的范围限制在 block 中,以便它在退出闭包而不是函数时触发?

我可以想象按顺序执行多个工作单元,每个工作单元都需要在继续之前关闭自己的资源......如果不必仅仅为了这个目的将它们分解成单独的函数就好了。

最佳答案

  1. Is my understanding correct?

是的。

  1. Is there a way to scope it to the block [...]?

无法更改defer 的工作方式。根据您要解决的问题,拆分函数 ( example ) 或定义匿名函数 ( example ) 可能会有所帮助。后者仅供引用,最好避免使用,因为它会降低代码的可读性。

有关 defer 的更多信息,请访问 Go Spec .

关于go - 为什么 golang "defer"的范围是函数,而不是词法封闭,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49456943/

相关文章:

go - 使用chilkat发送电子邮件时如何正确显示字符?

go - 是否可以强制 go 例程在特定 CPU 上运行?

go - 使用 Echo 服务文件

go - 为什么打印功能只执行一次

go - 如何运行查询并以CSV格式返回结果

docker - 在Docker Golang SDK中为client.ImagePull()禁用详细标准输出

windows - 运行Go文件困难

go - 尝试生成唯一的int64时生成负数的代码

go - 如何将文件上传到 Google Cloud Storage Bucket 子目录

从选项转到变量声明