Go_エラーハンドリングと並行処理
date
Mar 24, 2023
slug
errorgroup
status
Published
tags
Golang
summary
GO_並行処理のエラー処理
type
Post
今回は、Go言語でのエラーハンドリングと並行処理の最適化について詳しく説明します。Go言語は、エラーハンドリングをシンプルかつ効果的に行うことができる強力な機能を提供しています。また、並行処理を活用することで、アプリケーションのパフォーマンスを向上させることもできます。さっそく、具体的なコード例を見ていきましょう。
まず、以下のコードをご覧ください。
package main import ( "errors" "fmt" "golang.org/x/sync/errgroup" "runtime/debug" ) func main() { // エラーグループ起動 // 実行タスク指定 result, err := runGoErrGroup(subPro, subPro1) if err != nil { fmt.Println(err) } for _, v := range result { fmt.Println(v) } } func runGoErrGroup(fns ...func(int) (int, error)) ([]int, error) { eg := errgroup.Group{} result := make([]int, len(fns)) for i, fn := range fns { i, fn := i, fn eg.Go(func() error { defer func() { if err := recover(); err != nil { debug.PrintStack() } }() // タスク実行 k, err := fn(i) // エラーなければ、結果を設定、エラーの場合、処理終了 if err == nil { result[i] = k } return err }) } // エラー終了待ち if err := eg.Wait(); err != nil { // エラーを無視して、結果を返す // return result, err // エラー終了 log.Fatal(err) // log.Println(err) return nil, err // 結果を無視、エラー返す } return result, nil } func subPro(i int) (int, error) { if i == 0 { return i, errors.New("0 で割ることはできません") } return i, nil } func subPro1(i int) (int, error) { return i, nil }
上記のコードは、Go言語でエラーハンドリングと並行処理を実現する方法を示しています。
以下では、コードの各部分について詳しく説明します。
main
関数
main
関数は、プログラムのエントリーポイントです。以下の処理を行います。
runGoErrGroup
関数を呼び出し、実行するタスクとしてsubPro
とsubPro1
関数を指定します。
runGoErrGroup
関数の戻り値として、結果とエラーを受け取ります。
- もしエラーが発生した場合は、エラーメッセージを表示します。
- 結果を順番に表示します。
runGoErrGroup
関数
runGoErrGroup
関数は、与えられた関数群を並行して実行し、結果を収集します。以下の処理を行います。errgroup.Group
を初期化します。
- 結果を格納するためのスライス
result
を作成します。
- 各関数とインデックスをループで処理し、ゴルーチンとして実行します。
- ゴルーチン内では、タスクの実行結果を
result
スライスに格納します。
- もしエラーが発生した場合、エラーを返して処理を終了します。
eg.Wait()
を呼び出して、すべてのゴルーチンの終了を待ちます。もしエラーが発生した場合は、エラーを返します。
サブ関数
subPro
関数と subPro1
関数は、それぞれの関数に特定のルールに基づいた処理を行うためのものです。subPro
関数では、引数が0の場合にエラーを返します。以上が、Go言語でのエラーハンドリングと並行処理の最適化に関する詳細な説明でした。Go言語の強力な機能を活用することで、効果的なエラーハンドリングと高速な並行処理を実現することができます。
以上!