У меня есть самая простая программа net/http, которую я использую для изучения пространства имен в Go:
package main
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!"))
}
Когда я запускаю программу и подключаюсь к localhost:5678
в Chrome, я получаю это в консоли:
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
Но я не понимаю, как это возможно. Я печатаю URL-адрес, запускаю новую горутину, пишу заголовок один раз и даю ему статическое тело Hello, World!
. Похоже, происходит одно из двух. Либо что-то за кадром пишет другой заголовок, либо как-то дважды вызывается HandleIndex
для одного и того же запроса. Что я могу сделать, чтобы перестать писать несколько заголовков?
РЕДАКТИРОВАТЬ: Кажется, это как-то связано со строкой go HandleIndex(w, r)
, потому что, если я удалю go
и просто сделаю это вызовом функции вместо горутины, у меня не возникнет никаких проблем, и браузер получит свои данные. Поскольку это горутина, я получаю множественную ошибку WriteHeader, и браузер не показывает «Hello World». Почему это ломает горутина?