为了账号安全,请及时绑定邮箱和手机立即绑定

尝试包装函数时用作值错误的函数

尝试包装函数时用作值错误的函数

Go
GCT1015 2021-07-09 14:11:56
我正在通过 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错误。我之前没有过多地使用闭包,我觉得我在这里肯定错过了一些东西。
查看完整描述

1 回答

?
料青山看我应如是

TA贡献1772条经验 获得超8个赞

function(w, req)是一个没有返回值的函数调用,而addHeader期望一个函数作为它的参数。


如果你想结合这两个包装函数,你可能需要这样的东西:


func HandleWrapper(function HandleFunc) HandleFunc {

    return logPanics(addHeader(function))

}


查看完整回答
反对 回复 2021-07-12
  • 1 回答
  • 0 关注
  • 279 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信