php エディター Apple が答えます。Go 言語では、ゴルーチンでエラーが発生しても、メイン コルーチンには自動的に伝播されません。代わりに、暗黙的に無視されるため、起動されたすべてのゴルーチンでエラーが発生するのではなく、部分的なエラーのみが発生する可能性があります。これは、Go 言語の設計の本来の目的がプログラムの安定性と効率性を維持することであり、エラーが発生した場合でもプログラム全体がすぐに停止するわけではないためです。すべてのエラーを捕捉したい場合は、チャネルまたはその他のメカニズムを使用して、エラー情報を明示的に渡すことができます。こうすることで、すべてのエラーが正しく処理されることを確認できます。
同時タスクを処理するためにサイクルクラスを定義しました。私が望むのは、それぞれ goroutine で 2 つの関数を実行し、それらが完了するのを待って、出力エラーをマージすることです。しかし、エラーが発生するだけです。各メソッドの役割は次のとおりです:
run
- goroutine で関数を実行し、そのエラーを収集します
waitalldone
- すべての関数エラーをマージし、すべての関数が完了するまで待ちます
do1、do2
- テスト関数
最終的に t.log(err)
は err1
または err2
を出力しますが、err1 err2
を出力したいと考えています。なぜエラーが見逃されるのか。
これは、(*cycle).waitalldone
が goroutine の収集エラーが完了するのを待機しないためです。 -race
フラグを指定してコードを実行すると、いくつかのデータ競合エラーが報告される場合があります。これもその 1 つです:
この変更により問題が解決されます:
リーリーそして、range
句を使用して for ループを簡素化できます。
以上が開始したゴルーチンからすべてのエラーが発生せず、一部のエラーのみが発生するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。