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() 方法会在函数执行完成后或读取文件过程中抛出错误时执行,以确保已经打开的文件资源被关闭,从而避免内存泄露。