我正在通过 The Way to Go 书自学使用 net/http 包。他提到了一种将处理函数包装在一个闭包中的方法,它可以panics像这样处理:
func Index(w http.ResponseWriter, req *http.Request) {
w.Header().Set("Content-Type", "text/html")
fmt.Fprint(w, "<h2>Index</h2>")
}
func logPanics(function HandleFunc) HandleFunc {
return func(w http.ResponseWriter, req *http.Request) {
defer func() {
if err := recover(); err != nil {
log.Printf("[%v] caught panic: %v", req.RemoteAddr, err)
}
}()
function(w, req)
}
}
然后使用上面的方法调用 http.HandleFunc ,如下所示:
http.HandleFunc("/", logPanics(Index))
我想要做的是“堆叠”多个功能以包含更多功能。我想添加一个闭包,通过它添加一个 mime 类型.Header().Set(...),我可以这样称呼它:
func addHeader(function HandleFunc) HandleFunc {
return func(w http.ResponseWriter, req *http.Request) {
w.Header().Set("Content-Type", "text/html")
function(w, req)
}
}
(then in main())
http.HandleFunc("/", logPanics(addHeader(Index)))
但是我认为缩短它同时仍然使用包装函数将这些函数分开会很好:
func HandleWrapper(function HandleFunc) HandleFunc {
return func(w http.ResponseWriter, req *http.Request) {
logPanics(addHeader(function(w, req)))
}
}
但我得到一个function(w, req) used as value错误。我之前没有过多地使用闭包,我觉得我在这里肯定错过了一些东西。
料青山看我应如是
相关分类