我惊讶地发现这两个程序产生了相同的输出:
程序A
package main
import "fmt"
func main() {
defer fmt.Println(1)
defer fmt.Println(2)
}
Run Code Online (Sandbox Code Playgroud)
程序B
package main
import "fmt"
func main() {
{
defer fmt.Println(1)
}
defer fmt.Println(2)
}
Run Code Online (Sandbox Code Playgroud)
换句话说,“defer”语句似乎无视词法闭包[编辑:感谢@twotwotwo 纠正我的术语,我的意思是说“块”而不是“词法闭包”] 并且严格限定于函数。我想知道:
我可以想象按顺序执行多个工作单元,每个工作单元都需要在继续之前关闭自己的资源……最好不必仅出于此目的将它们分解为单独的功能。
是的。
如果你只能有一种行为,函数与块,哪个更容易定义另一个?
假设defer在块上工作。如果您想遵循更广泛的范围,则不能。有时,Go 需要您输入一个新块,例如在if语句中,这使得在应用 defer 时很难轻松控制。
现在,如果defer由函数限定范围,那么您可以轻松添加一个新函数来缩小范围。您甚至可以拥有一个直接调用的匿名函数。
func() {
defer ...
}()
Run Code Online (Sandbox Code Playgroud)| 归档时间: |
|
| 查看次数: |
5029 次 |
| 最近记录: |