デフォルトでは、Go の Goroutine のエラーは無視されるため、明示的に処理する必要があります。処理方法は次のとおりです: 1. パニック関数とリカバリ関数を使用して例外をキャプチャします。 2. エラー チャネルを使用してエラーを渡し、エラーをメイン関数で収集して処理できるようにします。
Go 言語関数の Goroutine エラー処理メカニズム
Goroutine は Go 言語の同時プログラミングの基礎であり、開発者はこれを使用して次のことを行うことができます。複数の機能を同時に実行します。 Goroutine は非常に強力ですが、エラー処理メカニズムにはいくつかの微妙な点があります。
デフォルトの動作: エラーを無視する
デフォルトでは、Goroutine でエラーが発生した場合、エラーは無視されます。これは、エラーが main 関数に伝播されず、ログに記録されないことを意味します。これにより、追跡とデバッグが困難な問題が発生する可能性があります。
Panic と Recover
Goroutine でエラーを処理する 1 つの方法は、panic
関数と recover
関数を使用することです。 panic
は例外をスローしますが、recover
は同じゴルーチンからの例外をキャッチできます。
例:
func goroutineWithPanic() { defer func() { if err := recover(); err != nil { log.Println("Error in goroutine:", err) } }() // 正常代码 } func main() { go goroutineWithPanic() }
上記の例では、defer
ステートメントにより、## 実行中であっても、常に recover
関数が呼び出されます。 #panic 関数が例外をスローした後。
エラー チャネル
Goroutine でエラーを処理するもう 1 つの方法は、エラー チャネルを使用することです。エラー チャネルは、Goroutine からエラーを渡すために使用できるバッファリングされていないチャネルです。 例:func goroutineWithErrors(errors chan error) { // 正常代码 // 如果发生错误,发送错误到通道 if err != nil { errors <- err } } func main() { errors := make(chan error) go goroutineWithErrors(errors) // 从通道中读取错误 err := <-errors if err != nil { log.Println("Error from goroutine:", err) } }
実際的なケース
Goroutine を使用して HTTP リクエストを並列実行する次の実際的なケースを考えてみましょう:func main() { // 创建一个 errors 通道来收集错误 errors := make(chan error) // 创建一个 goroutine 数组 routines := []func(){ func() { sendRequest("https://example1.com", errors) }, func() { sendRequest("https://example2.com", errors) }, func() { sendRequest("https://example3.com", errors) }, } // 并行运行 goroutine for _, r := range routines { go r() } // 收集和处理 goroutine 中发生的错误 for i := 0; i < len(routines); i++ { if err := <-errors; err != nil { log.Println("Error from goroutine:", err) } } }
以上がgolang関数のゴルーチンのエラー処理機構は何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。