Имам най-основната 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
се извиква два пъти за една и съща заявка. Какво мога да направя, за да спра да пиша множество заглавки?
РЕДАКТИРАНЕ: Изглежда има нещо общо с реда go HandleIndex(w, r)
, защото ако премахна go
и просто го направя извикване на функция вместо goroutine, не получавам никакви проблеми и браузърът получава неговите данни. Тъй като е goroutine, получавам множествената грешка WriteHeader и браузърът не показва „Hello World“. Защо превръщането на това в goroutine го нарушава?