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/

10-12 07:17