handleFunc 闭包函数的理解
来源:4-8 编码实战:快速实现访问鉴权接口+小结

阿斯蒂芬潍坊
2019-03-30
老师,请问这个闭包函数要怎么理解:
1.比如这个h(w,r)的作用是什么?
2.我能知道这个函数的作用,但参数之间的传递顺序是什么,看着好绕,该怎么去理解
写回答
2回答
-
同学你好,
1) h(w, r)其实就是具体的handler函数,比如main()函数里面的路由:
http.HandleFunc("/user/info", handler.HTTPInterceptor(handler.UserInfoHandler))
这个h(w, r)就是UserInfoHandler(w, r); 也就是在执行完了HTTPInterceptor中间件之后再执行UserInfoHandler。
2)对于没有HTTPInterceptor的情况, 用户请求过来直接就是调用UserInfoHandler(w, r)了;
对于加了HTTPInterceptor的情况, 首先执行HTTPInterceptor(UserInfoHandler), UserInfoHandler是HTTPInterceptor的传入参数,
在这个执行过程中,HTTPInterceptor会先校验UserInfoHandler的参数(如r.Form)有效性, 校验完之后再真正的执行UserInfoHandler的逻辑。
逻辑是有点绕,可能还是没描述清楚,先看下这个demo是否能理解?
package main import "fmt" // 这个相当于HTTPInterceptor func Wrapper(fa func(int) int) func(int) int { return func(valA int) int { // 在执行Test之前校验Test的传入参数,不通过则直接返回,不执行Test if valA < 0 { return 0 } return fa(valA) } } // 相当于UserInfoHandler func Test(a int) int { return a + 1 } func main() { // 没有加wrapper的情况 fmt.Println(Test(100)) fmt.Println(Test(-100)) // 加了wrapper的情况 fmt.Println(Wrapper(Test)(100)) // 这个直接是被Wrapper拦截了,并没有运行到Test fmt.Println(Wrapper(Test)(-100)) }
运行结果:
$ go run /data/bak/cc.go 101 -99 101 0
112019-04-01 -
Echo鑫
2019-03-31
其实就是拦截器做了一层包裹,之前是直接将W,R传递给handlerFunc,这里是将handerFunc这个函数作为参数传进来进行一层过滤,当满足条件后,才可以放行,拿到w,r,真正执行该方法。
212019-04-01
相似问题