延遲函式呼叫

延遲函式呼叫與諸如 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
}()