defer

210 字
1 分钟
defer

defer#

func main() {
defer fmt.Println("defer world") // 之后执行
fmt.Println("hello1")
fmt.Println("hello2")
}
---------
hello1
hello2
defer world
image.png

defer和return#

在return之后调用

defer 的使用场景#

1. 资源释放(关闭文件 / 连接)#

f, err := os.Open("file.txt")
if err != nil {
log.Fatal(err)
}
defer f.Close() // 函数返回前自动关闭文件

2. 释放锁#

mu.Lock()
defer mu.Unlock() // 忘记解锁或提前 return 也不会死锁

3. panic 恢复(recover)#

defer func() {
if r := recover(); r != nil {
fmt.Println("恢复 panic:", r)
}
}()

4. 记录函数执行时间 / 日志#

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

5. 关闭 HTTP 响应体#

resp, err := http.Get(url)
if err != nil {
return err
}
defer resp.Body.Close()

注意点#

  • defer 按 LIFO(后进先出) 顺序执行
  • 参数在 defer 语句执行时就立即求值(不是函数返回时)
  • 即使发生 panic,defer 也一定会执行

 

文章分享

如果这篇文章对你有帮助,欢迎分享给更多人!

defer
https://shaio.top/posts/丫丫学语/golang/defer/
作者
沙海
发布于
2026-08-10
许可协议
CC BY-NC-SA 4.0

评论区

Profile Image of the Author
沙海
Hello, I'm Shai.
公告
欢迎来到我的博客!这是一则示例公告。
音乐
封面

音乐

暂未播放

0:00 0:00
暂无歌词
分类
标签
站点统计
文章
84
分类
15
标签
48
总字数
67,035
运行时长
0 天
最后活动
0 天前
站点信息
构建平台
GitHub Actions
博客版本
Firefly v6.12.2
文章许可
CC BY-NC-SA 4.0

文章目录