写过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.