延迟函数调用
延迟函数调用与诸如 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
}()