延迟函数调用

延迟函数调用与诸如 Java 之类的语言中的 finally 块一样具有类似的目的:它们确保在外部函数返回时将执行某些函数,无论是否发生错误或在多次返回的情况下命中了哪个返回语句。这对于清理必须关闭的资源(如网络连接或文件指针)非常有用。defer 关键字表示延迟函数调用,类似于启动新 goroutine 的 go 关键字。与 go 调用一样,函数参数会立即求值,但与 go 调用不同,延迟函数不会同时执行。

func MyFunc() {
    conn := GetConnection()    // Some kind of connection that must be closed.
    defer conn.Close()        // Will be executed when MyFunc returns, regardless of how.
    // Do some things...
    if someCondition {
        return                // conn.Close() will be called
    }
    // Do more things
}// Implicit return - conn.Close() will still be called

注意使用 conn.Close() 而不是 conn.Close - 你不只是传入一个函数,而是推迟一个完整的函数调用,包括它的参数。可以在同一外部函数中延迟多个函数调用,并且每个函数调用将以相反的顺序执行一次。你也可以推迟关闭 - 只是不要忘记 parens!

defer func(){
    // Do some cleanup
}()