У меня есть самая простая программа 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-адрес, запускаю новый goroutine, пишу заголовок один раз и даю ему статическое тело Hello, World!
Кажется, что происходит одна из двух вещей. Либо что-то за кулисами пишет другой заголовок, либо как-то HandleIndex
вызывается дважды для одного и того же запроса. Что я могу сделать, чтобы прекратить писать несколько заголовков?
EDIT: похоже, что-то связано с линией go HandleIndex(w, r)
, потому что если я удалю go
и просто сделаю это вызовом функции вместо goroutine, я не получу никаких проблем, и браузер получит данные, Поскольку он является goroutine, я получаю множественную ошибку WriteHeader, и браузер не показывает "Hello World". Почему это нарушает его голотин?