Rumah > pembangunan bahagian belakang > Golang > Mengapa Menggunakan Goroutines dengan `WriteHeader` dalam Pakej `net/http` Go Menyebabkan 'pelbagai respons.WriteHeader panggilan'?

Mengapa Menggunakan Goroutines dengan `WriteHeader` dalam Pakej `net/http` Go Menyebabkan 'pelbagai respons.WriteHeader panggilan'?

Linda Hamilton
Lepaskan: 2024-12-28 19:02:11
asal
328 orang telah melayarinya

Why Does Using Goroutines with `WriteHeader` in Go's `net/http` Package Cause

Mengendalikan Berbilang Panggilan WriteHeader dalam Pelayan HTTP Go

Dalam pakej net/http Go, adalah penting untuk mengelakkan berbilang panggilan ke WriteHeader untuk sesuatu permintaan. Membuat panggilan goroutine dalam fungsi pengendali utama boleh membawa kepada isu ini, seperti yang ditunjukkan dalam contoh berikut:

func main() {
    http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
        fmt.Println(r.URL)
        go HandleIndex(w, r)
    })

    ...
}
Salin selepas log masuk

Dalam fungsi pengendali tanpa nama, kami sedang mencetak URL dan memulakan goroutine yang memanggil HandleIndex . Walau bagaimanapun, ini menyebabkan ralat "tindak balas berbilang.WriteHeader panggilan" dalam konsol.

Mengapa ini berlaku? Secara lalai, Go menetapkan status respons kepada 200 (HTTP OK) jika ia tidak ditetapkan secara eksplisit dalam fungsi pengendali. Dalam contoh ini, walaupun HandleIndex menetapkan pengepala dalam goroutine yang berasingan, fungsi pengendali utama selesai tanpa menulis apa-apa pada respons atau menetapkan status. Ini mencetuskan Go untuk menetapkan status secara automatik, mengakibatkan penulisan berbilang pengepala.

Untuk menyelesaikan isu ini, kami boleh mengalih keluar awalan go daripada go HandleIndex supaya ia dilaksanakan dalam goroutine yang sama dengan fungsi pengendali utama. Sebagai alternatif, dalam HandleIndex, kita boleh menetapkan pengepala respons sebelum fungsi pengendali utama kembali.

Pilihan lain ialah menggunakan perisian tengah untuk menetapkan pengepala respons sebelum permintaan mencapai fungsi pengendali utama. Dengan cara ini, fungsi pengendali utama tidak perlu menetapkan pengepala, dan perisian tengah memastikan bahawa pengepala ditetapkan sekali sahaja:

func main() {
    http.HandleFunc("/", middleware(HandleIndex))

    ...
}

func middleware(next http.HandlerFunc) http.HandlerFunc {
    return func(w http.ResponseWriter, r *http.Request) {
        w.Header().Set("Content-Type", "text/plain")
        next(w, r)
    }
}
Salin selepas log masuk

Dengan menggunakan perisian tengah, kami boleh memastikan bahawa pengepala respons adalah ditetapkan sebelum mengendalikan permintaan, mengelakkan sebarang kemungkinan isu dengan berbilang panggilan WriteHeader.

Atas ialah kandungan terperinci Mengapa Menggunakan Goroutines dengan `WriteHeader` dalam Pakej `net/http` Go Menyebabkan '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