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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值