Golang 第五章 8.defer

  • By v2ray节点

  • 2026-03-26 16:53:38

  • 评论

defer 语句用于 在函数返回前延迟执行某个操作

常用于释放资源、解锁、文件关闭等
即使函数因错误提前返回,defer 也会执行



基本语法

func main() {
    defer fmt.Println("world")
    fmt.Println("hello")
}

输出:

hello
world

defer 的调用在函数返回前执行
执行顺序 后进先出(LIFO)



defer 与函数返回

func f() int {
    x := 5
    defer fmt.Println("defer:", x)
    x += 1
    return x
}
fmt.Println("return:", f())

输出:

defer: 6
return: 6

defer 执行时读取 当时变量的值

return 语句计算返回值后才执行 defer



defer 多条语句

func main() {
    defer fmt.Println("first")
    defer fmt.Println("second")
    defer fmt.Println("third")
}

输出:

third
second
first

后定义的 defer 先执行
LIFO 栈顺序



defer 常见应用

关闭文件

f, err := os.Open("file.txt")
if err != nil {
    log.Fatal(err)
}
defer f.Close()

确保函数退出前关闭文件

解锁互斥锁

mu.Lock()
defer mu.Unlock()

保证解锁操作执行,即使函数中间返回

记录函数执行时间

start := time.Now()
defer func() {
    fmt.Println("耗时:", time.Since(start))
}()


注意事项

defer 会 增加少量开销

defer 调用顺序是 后进先出

defer 语句执行时会捕获 当时的参数值

v2ray节点购买