我寫了一個工具,它包裝了http.ResponseWriter
並提供了一種新的方法來渲染模板。如何實現方法覆蓋接口
type MyResponseWriter interface {
http.ResponseWriter
Render(tmpl string, v interface{}
}
type myResponseWriter struct {
server *Server
http.ResponseWriter
}
func (rw *myResponseWriter) Render(tmpl string, v interface{}) {
rw.server.Render(rw, tmpl, v)
}
現在,我要重寫MyResponseWriter
的Write
方法來啓用gzip壓縮,作爲一個可插入過濾器不知道的MyResponseWriter
實施。
我寫了一個GzipResponseWriter
這裏,並且它用作MyResponseWriter
,所以它的可插拔:
type GzipResponseWriter struct {
MyResponseWriter
}
func (grw *GzipResponseWriter) Write(data []byte) (int, error) {
return GzipWrite(grw.MyResponseWriter, data)
}
但是,當我讓GzipResponseWriter
然後調用Render
,它仍然會調用MyResponseWriter
的Write
,而不是GzipResponseWriter
, 和瀏覽器顯示「內容編碼錯誤」。
這時候,我所說的GzipResponseWriter
的Render
的一切,因爲,真正的方法接收器仍是myResponseWriter
,並Render
電話myResponseWriter
的Write
。
我認爲這是一個常見的需求,我們對庫/框架提供的接口的某些方法進行了更改,然後此接口的其他方法將調用這些新方法而不是舊方法。在我的問題中,需求是gzip壓縮,但這個特性在Go中很難實現。
是否有解決方案來實現此提議? 謝謝。
我假設你想寫'類型GzipResponseWriter接口{'(缺少'interface'關鍵字)... – icza 2015-02-09 12:22:43
謝謝。這是一個結構。 – cosiner 2015-02-09 12:28:11
那麼,這改變了圖片,我不得不重寫我的答案。 – icza 2015-02-09 12:36:20