1 回答

TA貢獻(xiàn)1868條經(jīng)驗 獲得超4個贊
"defer" 語句調(diào)用一個函數(shù),該函數(shù)的執(zhí)行被推遲到周圍函數(shù)返回的那一刻,因為周圍函數(shù)執(zhí)行了一個 return 語句,到達(dá)了它的函數(shù)體的末尾,或者因為相應(yīng)的 goroutine 處于恐慌狀態(tài)。
每次執(zhí)行“defer”語句時,函數(shù)值和調(diào)用的參數(shù)都會像往常一樣評估并重新保存,但不會調(diào)用實際的函數(shù)。相反,在周圍函數(shù)返回之前立即調(diào)用延遲函數(shù),以與它們延遲的相反順序調(diào)用。如果延遲函數(shù)值計算為 nil,則在調(diào)用函數(shù)時執(zhí)行會出現(xiàn)混亂,而不是在執(zhí)行“延遲”語句時。
例如,如果延遲函數(shù)是函數(shù)文字,并且周圍的函數(shù)具有在文字范圍內(nèi)的命名結(jié)果參數(shù),則延遲函數(shù)可以在返回結(jié)果參數(shù)之前訪問和修改結(jié)果參數(shù)。如果延遲函數(shù)有任何返回值,則在函數(shù)完成時將其丟棄。
func OpenOutputFile(name string) (fp *os.File) {
fp, err := os.Create(name)
if err != nil {
panic(err)
}
defer func() {
if err := fp.Close(); err != nil {
panic(err)
}
}()
return fp
}
你打開文件
fp, err := os.Create(name)
你關(guān)閉文件
err := fp.Close()
之后Close,fp不再指向有效的文件描述符。
- 1 回答
- 0 關(guān)注
- 277 瀏覽
添加回答
舉報