我惊讶地发现这两个程序产生相同的输出:
程序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 ”而不是“词法闭包”]并且严格限制在函数范围内。我想知道:
- 我的理解正确吗?
- 有没有办法将它的范围限制在 block 中,以便它在退出闭包而不是函数时触发?
我可以想象按顺序执行多个工作单元,每个工作单元都需要在继续之前关闭自己的资源......如果不必仅仅为了这个目的将它们分解成单独的函数就好了。
最佳答案
- Is my understanding correct?
是的。
- 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/