1 回答

TA貢獻(xiàn)1868條經(jīng)驗(yàn) 獲得超4個(gè)贊
"defer" 語(yǔ)句調(diào)用一個(gè)函數(shù),該函數(shù)的執(zhí)行被推遲到周圍函數(shù)返回的那一刻,因?yàn)橹車瘮?shù)執(zhí)行了一個(gè) return 語(yǔ)句,到達(dá)了它的函數(shù)體的末尾,或者因?yàn)橄鄳?yīng)的 goroutine 處于恐慌狀態(tài)。
每次執(zhí)行“defer”語(yǔ)句時(shí),函數(shù)值和調(diào)用的參數(shù)都會(huì)像往常一樣評(píng)估并重新保存,但不會(huì)調(diào)用實(shí)際的函數(shù)。相反,在周圍函數(shù)返回之前立即調(diào)用延遲函數(shù),以與它們延遲的相反順序調(diào)用。如果延遲函數(shù)值計(jì)算為 nil,則在調(diào)用函數(shù)時(shí)執(zhí)行會(huì)出現(xiàn)混亂,而不是在執(zhí)行“延遲”語(yǔ)句時(shí)。
例如,如果延遲函數(shù)是函數(shù)文字,并且周圍的函數(shù)具有在文字范圍內(nèi)的命名結(jié)果參數(shù),則延遲函數(shù)可以在返回結(jié)果參數(shù)之前訪問和修改結(jié)果參數(shù)。如果延遲函數(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)注
- 286 瀏覽
添加回答
舉報(bào)