
http.ResponseWriter是一个接口。因此,只需编写一个新实例:
type MyResponseWriter struct { http.ResponseWriter WroteHeader bool}func (w *MyResponseWriter) Write(b []byte) (int, error) { w.WroteHeader = true return w.ResponseWriter.Write(b)}func (w *MyResponseWriter) WriteHeader(pre int) { w.WroteHeader = true w.ResponseWriter.WriteHeader(pre)}在您的处理程序中:
//...if w, ok := w.(*MyResponseWriter); ok && w.WroteHeader { log.Println("Already wrote, skipping") return}编辑: 另一件事要考虑。在大多数情况下,如果您具有处理程序的“链”,则意味着在处理程序内部调用处理程序。所以如果你有类似的东西
type Handler1 struct { http.Handler }type Handler2 struct { http.Handler }type Handler3 struct { http.Handler }var MyHandler http.Handler = Handler1{Handler2{Handler3{h}}}只要每个那些调用内部处理程序 ,因为他们与做的最后一件事w
和r
,你应该罚款,因为那时
w和
r甚至不会到达内处理。例如
func (h Handler2) ServeHTTP(w http.ResponseWriter, r *http.Request) { if somethingBadHappened() { w.WriteHeader(http.StatusInternalServerError) return } h.ServeHTTP(w, r) // Not called if somethingBadHappened().}欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)