Effective Go
声明以下有关延期的内容:
这个例子使我感到困惑。如果在执行defer调用时评估了参数,则for循环中的defers应该打印5 5 5 5 5
,因为在for循环结束时将调用defer,那时i
将为5。在for结束时评估defers循环因此将导致所有调用都为5。
我在这里想念什么吗?
最佳答案
这似乎是连贯的(另请参见“Defer, Panic, and Recover”)
周围的函数返回后,将按照后进先出的顺序执行延迟的函数调用。
该函数显示“3210”:
func b() {
for i := 0; i < 4; i++ {
defer fmt.Print(i)
}
}
评估
defer
时的最后一次调用表示i=3
,而倒数第二个表示i=2
,依此类推。Golang spec:
是的,但是在循环运行时会先评估它们的参数。
当与闭包(How golang's “defer” capture closure's parameter?)一起使用时,“function literal”中的延迟情况比较棘手,如“Why add “
()
” after closure body in Golang?”中所述。关于go - Golang延迟行为,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24720097/