Heim > Backend-Entwicklung > Golang > Warum zeigt mein Go-HTTP-Programm „http: multiple Response.WriteHeader-Aufrufe' an?

Warum zeigt mein Go-HTTP-Programm „http: multiple Response.WriteHeader-Aufrufe' an?

Patricia Arquette
Freigeben: 2024-12-09 19:06:23
Original
936 Leute haben es durchsucht

Why Does My Go HTTP Program Show

Schreiben mehrerer Header in einem einfachen Go-HTTP-Programm

Ein häufiges Problem im Net/http-Paket von Go ist der Fehler „Mehrfachantwort“. WriteHeader-Aufrufe.“ Dies tritt auf, wenn mehrere Header in dieselbe HTTP-Antwort geschrieben werden.

Beachten Sie den folgenden Codeausschnitt:

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!"))
}
Nach dem Login kopieren

Bei Ausführung und Zugriff über localhost:5678 in Chrome zeigt die Konsole Folgendes an:

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
Nach dem Login kopieren

Ursache für das Schreiben mehrerer Header

Der Schlüssel Dieser Fehler liegt in der anonymen Funktion, die als Anforderungshandler verwendet wird:

func(w http.ResponseWriter, r *http.Request) {
    fmt.Println(r.URL)
    go HandleIndex(w, r)
}
Nach dem Login kopieren

Diese Funktion gibt die URL aus, erzeugt eine neue Goroutine, die HandleIndex() aufruft, und setzt die Ausführung fort. Wenn eine Handler-Funktion vor dem ersten Write-Aufruf keinen Antwortstatus setzt, setzt Go diesen automatisch auf 200 (HTTP OK). Wenn der Handler jedoch fertig wird, ohne in die Antwort zu schreiben, setzt Go den Status trotzdem auf 200.

In diesem Fall setzt die anonyme Funktion keinen Status und schreibt nichts, also setzt Go den Status auf 200.

Goroutine und Schreiben mehrerer Header

Wenn HandleIndex() in einer separaten Goroutine aufgerufen wird, wird die Die ursprüngliche anonyme Funktion vervollständigt und legt den Antwortheader fest. In der Zwischenzeit setzt die neue Goroutine auch den Header, was zu dem Fehler führt.

Lösung

Um diesen Fehler zu beheben, entfernen Sie entweder das Schlüsselwort go, um darin HandleIndex() aufzurufen die ursprüngliche Goroutine oder legen Sie den Antwortstatus explizit innerhalb der anonymen Funktion fest.

Das obige ist der detaillierte Inhalt vonWarum zeigt mein Go-HTTP-Programm „http: multiple Response.WriteHeader-Aufrufe' an?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage