php小編百草為您介紹一種在函數即將返回錯誤時清理資源的技術——”go”。這種技術可以幫助開發者在編寫代碼時更加優雅地處理資源清理的工作。通過使用”go”,開發者可以在函數返回錯誤之前,通過defer語句將資源的清理邏輯放在一個單獨的函數中,從而避免了代碼中的冗余和錯誤處理的繁瑣。”go”技術的簡潔和高效性使得它成為了許多php開發者的首選,讓我們一起來了解一下它的實現原理和使用方法吧!
問題內容
假設我有一個函數,首先創建一個目錄,然后執行更多操作,如下所示:
{ 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 }
登錄后復制
現在,我希望該函數刪除它在所有發生錯誤的情況下創建的目錄。最干凈的方法是什么?
一種方法是在每個 if
分支中調用 os.removeall
,但這不是一個很好的解決方案。另一種方法是使用 defer
語句,但在沒有錯誤的情況下也會執行。
解決方法
是的,延遲函數總是會被執行,但它是否刪除目錄完全取決于你。
使用延遲函數,并檢查錯誤。如果沒有錯誤,請勿刪除該目錄。為此,請使用命名結果參數,例如:
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) ... }
登錄后復制
請注意,如果有明確的 return
語句,例如:
return path, errors.New("bar")
登錄后復制
上面的 return
語句首先將值分配給 result
和 err
,因此在延遲函數中您可以獲取/查看這些值。
查看相關內容:如何在發生恐慌的 go 函數中返回一個值?