>백엔드 개발 >Golang >My Go HTTP 프로그램에 'http: 다중 응답.WriteHeader 호출'이 표시되는 이유는 무엇입니까?

My Go HTTP 프로그램에 'http: 다중 응답.WriteHeader 호출'이 표시되는 이유는 무엇입니까?

Patricia Arquette
Patricia Arquette원래의
2024-12-09 19:06:23940검색

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()를 호출하는 새 고루틴을 생성합니다. , 실행을 계속합니다. 핸들러 함수가 첫 번째 Write 호출 전에 응답 상태를 설정하지 않으면 Go는 자동으로 이를 200(HTTP OK)으로 설정합니다. 그러나 핸들러가 응답에 쓰지 않고 끝나면 Go는 상태를 200으로 설정합니다.

이 경우 익명 함수는 상태를 설정하지 않고 아무것도 쓰지 않으므로 Go는 상태를 200으로 설정합니다.

고루틴 및 다중 헤더 작성

HandleIndex()가 호출될 때 별도의 고루틴에서 원래 익명 함수는 응답 헤더를 완료하고 설정합니다. 동시에 새 고루틴도 헤더를 설정하여 오류가 발생합니다.

해결 방법

이 오류를 해결하려면 go 키워드를 제거하여 내부에서 HandleIndex()를 호출하세요. 원래 고루틴을 사용하거나 익명 함수 내에서 응답 상태를 명시적으로 설정하세요.

위 내용은 My Go HTTP 프로그램에 'http: 다중 응답.WriteHeader 호출'이 표시되는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.