Go の HTTP ハンドラーでの複数の WriteHeader 呼び出し
net/http サーバーを備えた単純な Go プログラムで、開発者は「多重応答」に遭遇します。 HTTP リクエストを処理しようとすると、「.WriteHeader 呼び出し」エラーが発生します。このエラーは、ハンドラー関数がヘッダーを一度書き込んで静的な本体を提供するように設計されているにもかかわらず、プログラムに HandleIndex 関数を実行するゴルーチンが組み込まれている場合に発生します。
エラーの説明
受信リクエストの処理を担当する匿名関数は URL を出力し、新しい goroutine で HandleIndex 関数を開始し、実行を進めます。ハンドラー関数が Write の最初の呼び出しの前に応答ステータスの設定を省略した場合、Go はステータスを自動的に 200 (HTTP OK) に設定します。さらに、ハンドラー関数が応答にコンテンツを書き込まない場合 (および応答ステータスを設定せず、正常に完了する場合)、これは成功した要求処理として扱われ、応答ステータスは 200 になります。
この場合、匿名関数は応答ステータスを設定せず、応答に何も書き込みません。したがって、Go は応答ステータスを 200 HTTP OK に設定します。各リクエストは独自のゴルーチンで処理されるため、新しいゴルーチンで HandleIndex が呼び出された場合、元の匿名関数は応答ヘッダーの設定を含めて実行を継続します。同時に、新しく開始されたゴルーチンも応答ヘッダーを設定し、「複数の応答.WriteHeader 呼び出し」エラーが発生します。
解決策: Goroutine を削除する
"go" キーワードの場合、HandleIndex はハンドラー関数と同じ goroutine で呼び出され、応答ヘッダーが設定されていることを確認します。ハンドラー関数が戻る前。これにより、「net/http」パッケージが応答ヘッダーを再度設定しようとすることがなくなり、エラーが解決されます。
以上がGoroutines を使用すると、Go の HTTP ハンドラーで「複数の応答.WriteHeader 呼び出し」が発生するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。