14.15 Defer 语句

defer 语句由以下内容组成:

  • defer 关键字,后跟

  • (非括号)函数或方法调用表达式。

func doSomething() {
    defer cleanUp()
    doHeavyWork()
}

在这个例子中,doHeavyWork 函数先被调用,然后在 doSomething 返回之前,cleanUp 被调用。

与表达式语句一样,某些内置函数不能在 defer 语句中使用。

当 defer 语句在函数中执行时,给定函数/方法的调用将被延迟到封装函数返回之前。

更精确地说:

  • 每次“defer”语句执行时,

    • 函数值和调用的参数在语句执行点被求值并保存,并且

  • 封装函数返回之前,

    • 所有延迟的函数按照它们被延迟的相反顺序被调用,使用保存的值。

如果延迟的函数有任何返回值,则它们将被丢弃。这种行为与表达式语句相同。

请注意,与延迟的函数参数不同,封闭的变量在函数调用时而不是在 defer 语句执行时被求值。

最后更新于