gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 02:28:51 30 4
gpt4 key购买 nike

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

程序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/

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