go defer

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语句到底哪个先执行这种细节而烦恼的时候,说明你的代码框架可能需要调整;

你可能感兴趣的:(我的GO语言学习之路)