2 回答

TA貢獻(xiàn)2065條經(jīng)驗(yàn) 獲得超14個(gè)贊
http.ResponseWriter是一個(gè)接口。所以只需編寫它的一個(gè)新實(shí)例:
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(code int) {
w.WroteHeader = true
w.ResponseWriter.WriteHeader(code)
}
在你的處理程序中:
//...
if w, ok := w.(*MyResponseWriter); ok && w.WroteHeader {
log.Println("Already wrote, skipping")
return
}
編輯:另一件事要考慮。大多數(shù)情況下,如果您有處理程序的“鏈”,則意味著在處理程序內(nèi)部調(diào)用處理程序。所以如果你有類似的東西
type Handler1 struct { http.Handler }
type Handler2 struct { http.Handler }
type Handler3 struct { http.Handler }
var MyHandler http.Handler = Handler1{Handler2{Handler3{h}}}
只要每個(gè)人都調(diào)用內(nèi)部處理程序作為他們對wand做的最后一件事r,你應(yīng)該沒問題,因?yàn)槟菢觲并且r甚至不會到達(dá)內(nèi)部處理程序。例如
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().
}

TA貢獻(xiàn)1826條經(jīng)驗(yàn) 獲得超6個(gè)贊
- 2 回答
- 0 關(guān)注
- 206 瀏覽
添加回答
舉報(bào)