Go defer 延迟执行
defer 确保资源清理,LIFO 顺序,参数求值时机 · 难度:入门 · +20XP
defer — "最后一定要执行"
defer 让函数调用在当前函数返回前执行。最常用于关闭文件、释放锁、记录日志。类似于 Java 的 finally 或 Python 的 with 语句。
基本用法
func readFile(path string) error {
f, err := os.Open(path)
if err != nil { return err }
defer f.Close() // 函数返回前一定执行,不用怕忘记关
// 读取和处理文件...
return nil
}
defer 的执行顺序:后进先出(LIFO)
defer fmt.Println("第3个 defer")
defer fmt.Println("第2个 defer")
defer fmt.Println("第1个 defer")
fmt.Println("正常代码")
// 输出:
// 正常代码
// 第1个 defer
// 第2个 defer
// 第3个 defer
defer 的参数求值时机
defer 语句立即求值参数,但函数调用延迟执行:
x := 1
defer fmt.Println(x) // x 此时为 1,defer 执行时也输出 1
x = 2 // 改 x 不影响 defer 的参数
实际应用:计时
func trackTime(name string) func() {
start := time.Now()
return func() { fmt.Printf("%s: %v
", name, time.Since(start)) }
}
defer trackTime("总耗时")() // 函数结束时自动打印耗时