Go语言中foo()(bar)语法含义及工作原理解析
Go中
foo()(bar)写法解析及你的代码工作原理 先搞懂foo()(bar)的本质
这是Go里的连续函数调用,核心逻辑分两步:
- 先执行
foo(),这个函数的返回值必须是一个函数类型; - 立刻用第一步得到的函数,传入
bar作为参数执行。
举个极简例子:
// 定义一个返回函数的函数 func createGreeter() func(string) string { return func(name string) string { return "Hi, " + name } } // 调用方式 result := createGreeter()("Alice") // result的值是"Hi, Alice"
这里createGreeter()先返回一个匿名函数,紧接着就用这个匿名函数传入"Alice"执行。
拆解你的代码preHandler()(http.HandlerFunc(handler))
结合你的代码一步步看:
第一步:调用preHandler()
看你的preHandler定义:
func preHandler() func(next http.Handler) http.Handler { log.Println("in preHandler") return func(next http.Handler) http.Handler { return check(next) } }
执行preHandler()时:
- 先打印
in preHandler; - 返回一个中间件函数,这个函数的作用是接收一个业务Handler(
next http.Handler),返回一个经过包装的新Handler。
第二步:用返回的中间件函数,传入http.HandlerFunc(handler)
http.HandlerFunc(handler)是Go标准库的类型转换:把你的普通函数handler(符合func(http.ResponseWriter, *http.Request)签名)转换成http.Handler接口类型,这样它就能被中间件处理;- 把这个转换后的Handler传给第一步返回的匿名函数,这个函数会调用
check(next),最终返回一个包装后的Handler。这个新Handler的执行逻辑是:先跑check函数里的逻辑(比如权限校验、日志记录这类通用操作),再执行原handler的业务逻辑。
最终效果
http.Handle("/test/", ...)注册的是这个包装后的Handler,当用户请求/test/时,会先经过check中间件的处理,通过后才会执行你的handler返回JSON响应。
为什么要这么写?
这是Go Web开发中中间件的标准实现模式:
preHandler()可以用来做中间件的初始化工作(比如加载配置、初始化第三方客户端),只在程序启动时执行一次;- 返回的中间件函数则会在每次请求时执行,负责包装业务Handler,实现通用逻辑的复用。
内容的提问来源于stack exchange,提问作者Mozzart
相关产品推荐
相关产品推荐

