go_Defer语句

Defer语句用于让函数or语句可以在当前函数执行完毕后执行

在这里插入图片描述
在这里插入图片描述
在 12 行使用 defer 语句,意味着函数将在函数返回finished()之前被调用。

mian函数开始执行并打印上述输出的前两行。在它返回之前,我们的延迟函数finished执行并打印文本Finished finding largest:

Defer方法

Defer不仅限于函数。延迟方法调用也是完全合法的。
在这里插入图片描述
Q:为什么会仅仅输出一个Welcome呢?

在上面的程序中,我们在第 22 行延迟了一个方法调用。 程序的其余部分很直观。该程序输出:Welcome John Smith

Defer堆栈

当一个函数有多个defer调用时,它们会被压入堆栈并以后进先出的方式执行
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

Defer在实际中使用

程序员在编程的时候,经常需要打开一些资源,比如数据库连接、文件、锁等,这些资源需要在用完之后释放掉,否则会造成内存泄漏。

defer可以很方便地在函数结束前做一些清理操作。在打开资源语句的下一行,直接一句defer就可以在函数返回前关闭资源,相当优雅。

func ReadFile(filename string) ([]byte, error) {
    f, err := os.Open(filename)
    if err != nil {
        return nil, err
    }
    defer f.Close()

    var n int64 = bytes.MinRead

    if fi, err := f.Stat(); err == nil {
        if size := fi.Size() + bytes.MinRead; size > n {
            n = size
        }
    }
    return readAll(f, n)
}

defer 修饰的 f.Close() 方法会在函数执行完成后或读取文件过程中抛出错误时执行,以确保已经打开的文件资源被关闭,从而避免内存泄露。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值