在Go 中優雅地處理多個錯誤
在Go 中,經常需要一次處理多個錯誤,尤其是在處理I /O 時操作或資料轉換。雖然單獨檢查每個錯誤的傳統方法可能是乏味且重複的,但 Go 提供了在一個簡潔的區塊中處理所有錯誤的機制。
問題:處理多個錯誤
考慮以下嘗試將多個值編組為JSON 的程式碼:
aJson, err1 := json.Marshal(a) bJson, err2 := json.Marshal(b) cJson, err3 := json.Marshal(c) dJson, err4 := json.Marshal(d) eJson, err5 := json.Marshal(e) fJson, err6 := json.Marshal(f) gJson, err4 := json.Marshal(g) if err1 != nil { return err1 } else if err2 != nil { return err2 } else if err3 != nil { return err3 } else if err4 != nil { return err4 } else if err5 != nil { return err5 } else if err5 != nil { return err5 } else if err6 != nil { return err6 }
此程式碼容易出錯並且需要對每個編組操作進行重複的錯誤處理檢查。它也使得處理所有 JSON 物件的錯誤變得具有挑戰性。
解決方案:使用非局部變數進行錯誤偵測
Go 提供了一種巧妙的方法來處理多個錯誤使用非局部變數的單一區塊。以下是程式碼的改進版本:
var err error f := func(dest *D, src S) bool { *dest, err = json.Marshal(src) return err == nil } f(&aJson, a) && f(&bJson, b) && f(&cJson, c) && f(&dJson, d) && f(&eJson, e) && f(&fJson, f) && f(&gJson, g) return err
在此解決方案中,我們定義了一個 f 函數來執行封送處理並設定 err 變數。 err 變數在函數外部聲明,允許在對 f 函數的所有呼叫之間共享它。
f 函數採用指向目標 JSON 物件和來源資料的指標。它傳回一個布林值,指示編組是否成功(沒有發生錯誤)。
之後,我們為每個物件呼叫 f 函數,並用 && (邏輯與)連接結果。如果任何呼叫返回 false(發生錯誤),鏈就會中斷,並且 err 變數包含第一個遇到的錯誤。否則,如果所有呼叫都回傳 true,則沒有錯誤發生,最終 err 為 nil。
在最後一行,我們返回err 變量,它保存第一個遇到的錯誤,如果所有操作都成功,則返回nil .
這種方法允許我們在一條語句中處理所有錯誤,使錯誤處理更加簡潔和有效率。
以上是Go 如何有效率地處理單一區塊中的多個錯誤?的詳細內容。更多資訊請關注PHP中文網其他相關文章!