在go語言里,defer可是實(shí)現(xiàn)延遲函數(shù)調(diào)用自脯。語句defer向當(dāng)前函數(shù)注冊稍后執(zhí)行的函數(shù)調(diào)用。這些調(diào)用被稱做延遲調(diào)用斤富,因?yàn)樗鼈冎喇?dāng)前函數(shù)執(zhí)行結(jié)束前才被執(zhí)行膏潮,常用于資源釋放、解除鎖定满力,以及錯誤處理等操作焕参。
func main() {
f, err := os.Open("./main.go")
if err != nil {
log.Fatal(err)
}
defer f.Close() //僅注冊轻纪,直到main退出前才執(zhí)行
println("hello world")
}
延遲調(diào)用注冊的是調(diào)用,必須提供執(zhí)行所需參數(shù)(哪怕為空)叠纷。參數(shù)值在注冊時被復(fù)制并緩存起來刻帚。如對狀態(tài)敏感,可改用指針讲岁。
func main() {
x, y := 1, 2
defer func(a int) {
println("defer x, y =",a, y) //y為閉包引用
}(x) //注冊時復(fù)制調(diào)用參數(shù)
x += 100 //對x的修改不會影響延遲調(diào)用
y += 200
println(x, y)
}
輸出:
101 202
defer x, y = 1 202