我定义了一个多部分写入器,将数据直接流式传输到类型为http.ResponseWriter
的响应写入器。为了避免出现错误,并且为了示例的简单性,我将状态代码编写为w,如下所示:
if err != nil {
w.WriteHeader(404) // works as expected, 404 is written
fmt.Println(w) // status code is 404
return
}
multiPartWriter := multipart.NewWriter(w)
defer multiPartWriter.Close()
if err != nil {
w.WriteHeader(404) // weirdly gets ignored
fmt.Println(w) // status code is 200
return
}
如示例所示,在定义multipart写入器之前发生的任何错误都按预期工作,之后发生的任何错误都被忽略。我确定w.WriteHeader(404)
被执行了,它被奇怪地忽略了,没有返回任何错误。你知道我错过了什么吗?
好了,我终于知道发生了什么(感谢@icza的线索)。任何对w的写入都会触发一个隐式的WriteHeader(http.StatusOK),并且在此之后不可能覆盖header。这就是为什么显式状态码集被忽略的原因。奇怪的是,golang没有产生任何警告。