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 關注
- 158 瀏覽
添加回答
舉報