ホームページ >バックエンド開発 >Golang >Go は単一ブロック内の複数のエラーを効率的に処理するにはどうすればよいでしょうか?

Go は単一ブロック内の複数のエラーを効率的に処理するにはどうすればよいでしょうか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-12-09 03:09:16663ブラウズ

How Can Go Efficiently Handle Multiple Errors in a Single Block?

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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。