php小編百草為您介紹一種在函數(shù)即將返回錯(cuò)誤時(shí)清理資源的技術(shù)——”go”。這種技術(shù)可以幫助開發(fā)者在編寫代碼時(shí)更加優(yōu)雅地處理資源清理的工作。通過使用”go”,開發(fā)者可以在函數(shù)返回錯(cuò)誤之前,通過defer語句將資源的清理邏輯放在一個(gè)單獨(dú)的函數(shù)中,從而避免了代碼中的冗余和錯(cuò)誤處理的繁瑣。”go”技術(shù)的簡潔和高效性使得它成為了許多php開發(fā)者的首選,讓我們一起來了解一下它的實(shí)現(xiàn)原理和使用方法吧!
問題內(nèi)容
假設(shè)我有一個(gè)函數(shù),首先創(chuàng)建一個(gè)目錄,然后執(zhí)行更多操作,如下所示:
{
err := os.Mkdir(path, os.ModePerm)
...
err = doSomething()
if err != nil {
return nil, err
}
err = doSomethingElse()
if err != nil {
return nil, err
}
return path, nil
}
登錄后復(fù)制
現(xiàn)在,我希望該函數(shù)刪除它在所有發(fā)生錯(cuò)誤的情況下創(chuàng)建的目錄。最干凈的方法是什么?
一種方法是在每個(gè) if 分支中調(diào)用 os.removeall ,但這不是一個(gè)很好的解決方案。另一種方法是使用 defer 語句,但在沒有錯(cuò)誤的情況下也會(huì)執(zhí)行。
解決方法
是的,延遲函數(shù)總是會(huì)被執(zhí)行,但它是否刪除目錄完全取決于你。
使用延遲函數(shù),并檢查錯(cuò)誤。如果沒有錯(cuò)誤,請(qǐng)勿刪除該目錄。為此,請(qǐng)使用命名結(jié)果參數(shù),例如:
func foo() (result resulttype, err error) {
path := "some folder"
defer func() {
if err != nil { // this is the result err
if err2 := os.removeall(path); err2 != nil {
// handle err2
}
}
}()
err := os.mkdir(path, os.modeperm)
...
}
登錄后復(fù)制
請(qǐng)注意,如果有明確的 return 語句,例如:
return path, errors.New("bar")
登錄后復(fù)制
上面的 return 語句首先將值分配給 result 和 err,因此在延遲函數(shù)中您可以獲取/查看這些值。
查看相關(guān)內(nèi)容:如何在發(fā)生恐慌的 go 函數(shù)中返回一個(gè)值?






