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
Patricia Arquetteasal
2024-12-09 19:06:231011semak imbas

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!"))
}

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

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)
}

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!

Kenyataan:
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