ホームページ >バックエンド開発 >Golang >Go HTTP プログラムで「http: multiple response.WriteHeader 呼び出し」が表示されるのはなぜですか?

Go HTTP プログラムで「http: multiple response.WriteHeader 呼び出し」が表示されるのはなぜですか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-12-09 19:06:23944ブラウズ

Why Does My Go HTTP Program Show

シンプルな 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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。