在 Go 语言里,defer 语句的用法是怎样的?请说明其典型应用场景。
考察说明
考查对 Go 语言 defer 语句基本用法和特性的理解。
回答思路
- 【回答框架 1】defer 语句用于延迟执行一个函数调用,该调用会在所在函数返回之前执行,无论函数是正常返回还是发生 panic。多个 defer 语句按后进先出(LIFO)的顺序执行。
- 【回答框架 2】典型应用场景包括资源释放(如关闭文件、解锁互斥锁、关闭数据库连接),确保即使发生错误或 panic 也能执行清理操作。
- 【回答框架 3】defer 语句的参数在声明时求值,而不是在调用时求值,这可能导致一些容易误解的行为。
- 【回答框架 4】defer 还可以用于在函数返回前修改命名返回值,但需要注意执行时机和返回值的影响。
- 【关键点 1】defer 确保函数返回前执行,常用于资源清理。
- 【关键点 2】多个 defer 按 LIFO 顺序执行。
- 【关键点 3】defer 参数在声明时求值。
- 【易错点 1】在循环中使用 defer 可能导致资源堆积,应避免在循环内使用 defer 进行资源清理。
- 【易错点 2】对 defer 中函数的返回值无法直接控制,除非使用命名返回值。