handleFunc 闭包函数的理解

来源:4-8 编码实战:快速实现访问鉴权接口+小结

阿斯蒂芬潍坊

2019-03-30

图片描述

老师,请问这个闭包函数要怎么理解:
1.比如这个h(w,r)的作用是什么?
2.我能知道这个函数的作用,但参数之间的传递顺序是什么,看着好绕,该怎么去理解

写回答

2回答

xiaomo

2019-03-31

同学你好, 

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
1
1
阿斯蒂芬潍坊
谢谢老师
2019-04-01
共1条回复

Echo鑫

2019-03-31

其实就是拦截器做了一层包裹,之前是直接将W,R传递给handlerFunc,这里是将handerFunc这个函数作为参数传进来进行一层过滤,当满足条件后,才可以放行,拿到w,r,真正执行该方法。

2
1
阿斯蒂芬潍坊
谢谢同学
2019-04-01
共1条回复

Go实战仿百度云盘-实现企业级分布式云存储系统

紧随“云时代”技术潮流,分布式云存储系统,做第一代云程序员

1077 学习 · 494 问题

查看课程