Rumah > pembangunan bahagian belakang > Golang > Mengapa Program HTTP My Go Menunjukkan 'http: pelbagai respons.WriteHeader panggilan'?

Mengapa Program HTTP My Go Menunjukkan 'http: pelbagai respons.WriteHeader panggilan'?

Patricia Arquette
Lepaskan: 2024-12-09 19:06:23
asal
936 orang telah melayarinya

Why Does My Go HTTP Program Show

Penulisan Pengepala Berbilang dalam Program HTTP Simple Go

Isu biasa dalam pakej net/http Go sedang menghadapi ralat "tindak balas berbilang. Panggilan WriteHeader." Ini berlaku apabila berbilang pengepala ditulis pada respons HTTP yang sama.

Pertimbangkan coretan kod berikut:

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!"))
}
Salin selepas log masuk

Apabila dijalankan dan diakses melalui localhost:5678 dalam Chrome, konsol memaparkan:

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
Salin selepas log masuk

Punca Berbilang Pengepala Menulis

Kunci kepada ralat ini terletak pada fungsi tanpa nama yang digunakan sebagai pengendali permintaan:

func(w http.ResponseWriter, r *http.Request) {
    fmt.Println(r.URL)
    go HandleIndex(w, r)
}
Salin selepas log masuk

Fungsi ini mencetak URL, menghasilkan goroutine baharu yang memanggil HandleIndex() , dan meneruskan pelaksanaan. Jika fungsi pengendali tidak menetapkan status respons sebelum panggilan Tulis pertama, Go secara automatik menetapkannya kepada 200 (HTTP OK). Walau bagaimanapun, jika pengendali selesai tanpa menulis pada respons, Go masih akan menetapkan status kepada 200.

Dalam kes ini, fungsi tanpa nama tidak menetapkan status dan tidak menulis apa-apa, jadi Go menetapkan status kepada 200.

Penulisan Goroutine dan Berbilang Tajuk

Bila HandleIndex() digunakan dalam goroutine yang berasingan, fungsi tanpa nama asal melengkapkan dan menetapkan pengepala respons. Sementara itu, goroutine baharu turut menetapkan pengepala, mengakibatkan ralat.

Penyelesaian

Untuk menyelesaikan ralat ini, sama ada alih keluar kata kunci go untuk menggunakan HandleIndex() dalam goroutine asal atau secara eksplisit menetapkan status respons dalam fungsi tanpa nama.

Atas ialah kandungan terperinci Mengapa Program HTTP My Go Menunjukkan 'http: pelbagai respons.WriteHeader panggilan'?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan