go语言的defer函数,很强大,可以说defer绝大多数情况下扮演的是清道夫或者擦屁股的角色;
defer 是定义一种行为,当程序执行范围脱离与当前defer的作用域时,会按照该作用域内“后定义先执行”的顺序调用defer。
有点类似C++中,我们经常定义某些自动操作类,在跳出该操作类对象作用域时,会执行到析构函数,从而达到清理资源的作用。
func CopyFile(dst, src string)(w int64, err error){
srcFile, err := os.Open(src)
if err != nil {
return //第一个返回
}
defer srcFile.Close() //deferA
dstFile, err := os.Open(dst)
if err != nil {
return //第二个返回
}
defer dstFile.Clost() //deferB
return io.Copy(dstFile, srcFile) //第三个返回
}
//当CopyFile执行完成时(包括第二个返回和第三个返回)
//会按照实际声明defer的顺序,反序执行
//当执行到第二个返回时,执行deferA
//当执行到第三个返回时,按反序分别执行deferB和deferA
//总之,defer是预定义在退出作用域时,需要执行清理哪些资源或回滚数据之类的操作
参考资料中提到一句话,我觉得很有必要记录下来:当你需要为defer语句到底哪个先执行这种细节而烦恼的时候,说明你的代码框架可能需要调整;