Go 关键字 defer 使用详解(使用场景易错分析)
核心原理
defer 是 Go 语言的一大特性,defer 的字面意思是“延迟”,但很多人只知道它“延迟执行”,却不懂背后的逻辑,这是踩坑的根源。
先记住 3 个核心原理:
- 执行时机:defer 修饰的函数会在“所在函数执行完 return 语句后、真正返回前”执行,不是在函数结束时才执行,也不是在 defer 定义时执行;
- 参数预计算:defer 修饰的函数的参数,在定义 defer 时就会计算出具体值,而不是在执行 defer 时才计算;
- 栈式执行:多个 defer 同时存在时,遵循“后进先出”(LIFO)的栈式顺序,最后定义的 defer 最先执行。
用 defer 可以来声明一些延迟函数,这些延迟函数会被放进队列里,在外层函数执行完成后会依次执行延迟函数: