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