Go で複数のエラーをエレガントに処理する
Go では、特に I/O を処理する場合に、一度に複数のエラーを処理する必要があることがよくあります。操作またはデータ変換。各エラーを個別にチェックする従来のアプローチは退屈で反復的である可能性がありますが、Go はすべてのエラーを 1 つの簡潔なブロックで処理するメカニズムを提供します。
問題: 複数のエラーの処理
複数の値を 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
このソリューションでは、マーシャリングを実行し、err 変数を設定する f 関数を定義します。 err 変数は関数の外部で宣言され、f 関数へのすべての呼び出し間で共有できるようにします。
f 関数は、宛先 JSON オブジェクトとソース データへのポインターを受け取ります。マーシャリングが成功したかどうか (エラーは発生しなかったのか) を示すブール値を返します。
その後、各オブジェクトに対して f 関数を呼び出し、結果を && (論理積) で接続します。いずれかの呼び出しが false を返す (エラーが発生した) 場合、チェーンは切断され、err 変数には最初に発生したエラーが含まれます。それ以外の場合、すべての呼び出しが true を返した場合、エラーは発生せず、最後の err は nil です。
最後の行では、最初に発生したエラーを保持する err 変数を返します。すべての操作が成功した場合は nil を返します。 .
このアプローチにより、すべてのエラーを 1 つのステートメントで処理できるため、エラー処理がより簡潔かつ効率的になります。
以上がGo は単一ブロック内の複数のエラーを効率的に処理するにはどうすればよいでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。