간단한 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!