【发布时间】:2014-09-03 09:35:03
【问题描述】:
Effective Go 关于延迟的声明如下:
延迟函数的参数(如果函数是方法,则包括接收者)在 defer 执行时评估,而不是在 call 执行时评估。除了避免担心在函数执行时变量会改变值,这意味着单个延迟调用站点可以延迟多个函数执行。这是一个愚蠢的例子。
for i := 0; i < 5; i++ { defer fmt.Printf("%d ", i) }延迟函数按 LIFO 顺序执行,因此此代码将导致函数返回时打印
4 3 2 1 0。
这个例子让我很困惑。如果在执行 defer 调用时计算参数,那么 for 循环中的 defers 应该打印 5 5 5 5 5,因为当 for 循环结束时将调用 defers,那时 i 将是 5。因此,for 循环的结尾将导致所有调用为 5。
我错过了什么吗?
【问题讨论】:
标签: go