シンプルな Go HTTP プログラムでの複数のヘッダーの書き込み
Go の net/http パッケージでよくある問題は、エラー「複数の応答」が発生することです。 WriteHeader が呼び出されます。」これは、複数のヘッダーが同じ HTTP 応答に書き込まれるときに発生します。
次のコード スニペットを考えてみましょう:
import ( "fmt" "log" "net/http" ) func main() { http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { fmt.Println(r.URL) go HandleIndex(w, r) }) fmt.Println("Starting Server...") log.Fatal(http.ListenAndServe(":5678", nil)) } func HandleIndex(w http.ResponseWriter, r *http.Request) { w.WriteHeader(200) w.Write([]byte("Hello, World!")) }
Chrome で localhost:5678 を介して実行およびアクセスすると、コンソールに次の表示が表示されます。
Starting Server... / 2015/01/15 13:41:29 http: multiple response.WriteHeader calls /favicon.ico 2015/01/15 13:41:29 http: multiple response.WriteHeader calls
複数ヘッダーの原因
の書き込み このエラーの鍵は、リクエスト ハンドラーとして使用される匿名関数にあります。
func(w http.ResponseWriter, r *http.Request) { fmt.Println(r.URL) go HandleIndex(w, r) }
この関数は URL を出力し、HandleIndex() を呼び出す新しい goroutine を生成します。 、実行を続行します。最初の Write 呼び出しの前にハンドラー関数が応答ステータスを設定しない場合、Go は自動的に応答ステータスを 200 (HTTP OK) に設定します。ただし、ハンドラーが応答に書き込まずに終了した場合でも、Go はステータスを 200 に設定します。
この場合、匿名関数はステータスを設定せず、何も書き込まないため、Go はステータスを 200 に設定します。
Goroutine と複数のヘッダーの書き込み
HandleIndex() が別のゴルーチンで呼び出されると、元の匿名関数が完了し、応答ヘッダーが設定されます。一方、新しいゴルーチンもヘッダーを設定するため、エラーが発生します。
解決策
このエラーを解決するには、 go キーワードを削除して、中で HandleIndex() を呼び出します。元のゴルーチンを使用するか、匿名関数内で応答ステータスを明示的に設定します。
以上がGo HTTP プログラムで「http: multiple response.WriteHeader 呼び出し」が表示されるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。