3 回答

TA贡献1880条经验 获得超4个赞
创建一个包装器来设置标题:
func wrap(h http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) (
w.Header().Set("Server", SERVER_NAME)
h.ServeHTTP(w, r)
})
}
包装单个处理程序
http.Handle("/path", wrap(aHandler)(
http.Handle("/another/path", wrap(anotherHandler))
或传递给 ListenAndServe 的根处理程序:
log.Fatal(http.ListenAndServe(addr, wrap(rootHandler))

TA贡献1836条经验 获得超13个赞
“喜欢组合而不是继承” - 4人帮
继承根本就没有被设计到 Golang 中。;)
如果您正在寻找有关原因部分的详细解释,我相信这已经在 SO 上得到了回答,因此我只想向您指出:在 Go 中嵌入而不是继承。
嗯,您实际上可以使用适配器设计模式实现相同的结果,它使您能够从内置库扩展功能,对我来说,它的方式比继承更灵活。
func adapter(h http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Server", SERVER_NAME)
h.ServeHTTP(w, r)
})
}
或者serverName作为参数传入:
func adapter(h http.Handler, serverName string) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Server", serverName)
h.ServeHTTP(w, r)
})
}
最后,您可以灵活选择要“继承”的处理程序:
http.Handle("/path", adapter(your_handler))
或者,如果它适用于每个处理程序,只需“继承”到根处理程序:
http.ListenAndServe(port, adapter(root_Handler))

TA贡献1943条经验 获得超7个赞
的http.ResponseWriter是interface,不是struct。所以,你不能直接扩展它。您需要扩展内部struct. 但这不是解决这个问题的惯用方法。
您可以采取的一种方法是使用middleware. middleware只是一段将在您的主请求处理程序之前执行的代码,可用于执行一些常见任务。
例如,使用middleware方法编写相同的东西:
func injectServerHeader(handler http.Handler, serverName string) http.Handler {
ourFunc := func(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Server", serverName)
handler.ServeHTTP(w, r)
}
return http.HandlerFunc(ourFunc)
}
这样,您就可以使用中间件包装实际的 http 处理程序。因此,您不必一遍又一遍地编写相同的代码。
例如:
http.Handle("/some-path", injectServerHeader(aHandler))
- 3 回答
- 0 关注
- 159 浏览
添加回答
举报