golang defer避免资源泄漏

追梦人在路上不断追寻 · 2020-08-30 00:32:46 · 1460 次点击 · 预计阅读时间不到 1 分钟 · 大约8小时之前 开始浏览    
这是一个创建于 2020-08-30 00:32:46 的文章,其中的信息可能已经有所发展或是发生改变。

写过c语言的同学都知道,如果稍加不小心,我们就会造成资源内存的泄漏,如果在golang语言中避免这个问题呢?或者说减少资源泄露的可能性?答案就是defer.

在打开资源语句的下一行,就可以直接用 defer语句来注册函数结束后执行关闭资源的操作。比如数据库连接、文件、锁等,这些资源需要在用完之后释放掉,否则会造成内存泄漏。我们就可以在打开之后,使用defer避免资源泄漏。

f, err :=os.Open(filename)

if err != nil{
    panic(err)
}

if f != nil{
    defer f.Close()
}

原理

每次defer语句执行的时候,会把函数“压栈”,函数参数会被拷贝下来;当外层函数(非代码块,如一个for循环)退出时,defer函数按照定义的逆序执行;如果defer执行的函数为nil, 那么会在最终调用函数的产生panic.


有疑问加站长微信联系(非本文作者)

本文来自:简书

感谢作者:追梦人在路上不断追寻

查看原文:golang defer避免资源泄漏

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

1460 次点击  ∙  1 赞  
加入收藏 微博
2 回复  |  直到 2022-01-30 13:13:15
avtion
avtion · #1 · 5年之前

通常情况下err != nil已经表示打开的文件指针为nil,后续不再需要判断了

f, err := os.Open("test.txt)
if err != nil {
    return
}
defer f.Close()
lysShub
lysShub · #2 · 3年之前

1.17的差别很小了,在我的机器上分别是11和12纳秒

添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传