知识卡片

Defer后进先出

普通读书笔记卡 · 1476

内容

多个 defer 按后进先出执行,参数在注册 defer 时先求值。资源释放依赖这个顺序时,要把注册位置当成控制流的一部分,而不是简单的“函数结束再说”。

参考来源

- 位置:《Go语言底层原理剖析》第10章《defer延迟调用》10.2.2、10.2.3节《参数预计算》《defer多次执行与LIFO执行顺序》 - 结论依据:原文明确"这些defer函数将按照后入先出(last-in first-out,LIFO)的顺序执行,这与栈的执行顺序是相同的",并用参数预计算的例子说明"参数的预计算指当函数到达defer语句时,延迟调用的参数将立即求值,传递到defer函数中的参数将预先被固定",因此可以推出"defer 按 LIFO 执行、参数在注册时求值"的结论。 - 原始内容:在函数体内部,可能出现多个defer函数。这些defer函数将按照后入先出(last-in first-out,LIFO)的顺序执行,这与栈的执行顺序是相同的……参数的预计算指当函数到达defer语句时,延迟调用的参数将立即求值,传递到defer函数中的参数将预先被固定,而不会等到函数执行完成后再传递参数到defer中。