gpt4 book ai didi

go - 如何实现接口(interface)的方法覆盖

转载 作者:IT王子 更新时间:2023-10-29 02:24:06 24 4
gpt4 key购买 nike

我写了一个包装 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)
}

现在,我想覆盖 MyResponseWriterWrite在不知道 MyResponseWriter 的实现的情况下启用 gzip 压缩作为可插入过滤器的方法.

我写了一个 GzipResponseWriter在这里,它用作 MyResponseWriter ,所以它是可插拔的:
type GzipResponseWriter struct {
MyResponseWriter
}

func (grw *GzipResponseWriter) Write(data []byte) (int, error) {
return GzipWrite(grw.MyResponseWriter, data)
}

但是,当我启用 GzipResponseWriter然后调用 Render ,它仍然调用 MyResponseWriterWrite , 而不是 GzipResponseWriter ,
浏览器会显示“内容编码错误”。

这都是因为我打电话时 RenderGzipResponseWriter ,真正的方法接收者仍然是 myResponseWriter , 和 Render电话 myResponseWriterWrite .

我认为我们对库/框架提供的接口(interface)的某些方法进行更改是一个常见的要求,然后该接口(interface)的其他方法将调用这些新方法而不是旧方法。在我的问题中,要求是 gzip 压缩,但是这个功能在 Go 中很难实现。

有没有解决方案来实现这个提议?
谢谢。

最佳答案

添加新字段 out io.WritermyResponseWriter ,并添加 io.Write()使用此方法的方法 out field :

type myResponseWriter struct {
out io.Writer
server *Server
http.ResponseWriter
}

func (m *myResponseWriter) Write(b []byte) (int, error) {
return m.out.Write(b)
}

并且默认设置相同 http.ResponseWriterout场也是。

当您想切换到 Gzipped 响应时,只需将 out 包裹起来即可。像这样的作家:
out = gzip.NewWriter(out)

myResponseWriter.Write()使用 out领域,您的 Render()方法将通过 gzip 编写器发送其输出。

关于go - 如何实现接口(interface)的方法覆盖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28409445/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com