3 回答
TA贡献1802条经验 获得超5个赞
看一下您注册为传入请求处理程序的匿名函数:
func(w http.ResponseWriter, r *http.Request) {
fmt.Println(r.URL)
go HandleIndex(w, r)
}
它打印 URL(到标准输出),然后调用HandleIndex()一个新的 goroutine 并继续执行。
如果你有一个处理函数,你在第一次调用之前没有设置响应状态Write,Go 会自动将响应状态设置为 200(HTTP OK)。如果处理函数没有向响应写入任何内容(并且没有设置响应状态并正常完成),也被视为成功处理请求,并且响应状态 200 将被发送回。您的匿名函数没有设置它,它甚至没有向响应写入任何内容。所以 Go 会这样做:将响应状态设置为 200 HTTP OK。
请注意,处理每个请求都在其自己的 goroutine 中运行。
因此,如果您调用HandleIndex新的 goroutine,您的原始匿名函数将继续:它将结束,因此将设置响应标头 - 同时(同时)您启动的新 goroutine 也将设置响应标头 - 因此出现"multiple response.WriteHeader calls"错误。
如果您删除"go",您的HandleIndex函数将在您的处理程序函数返回之前在同一个 goroutine 中设置响应头,并且“net/http”将知道这一点并且不会再次尝试设置响应头,因此您遇到的错误将不会发生。
TA贡献1911条经验 获得超7个赞
从文档:
// WriteHeader sends an HTTP response header with status code.
// If WriteHeader is not called explicitly, the first call to Write
// will trigger an implicit WriteHeader(http.StatusOK).
在您的情况下发生的事情是您go HandleIndex从处理程序启动。第一个处理程序完成。标准 WriteHeader 写入 ResponseWriter。然后 go 例程 HandleIndex 被启动,它也尝试写一个标题并写入。
只需go从 HandleIndex 中删除它,它就会起作用。
- 3 回答
- 0 关注
- 166 浏览
添加回答
举报