You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Go语言中foo()(bar)语法含义及工作原理解析

Go中foo()(bar)写法解析及你的代码工作原理

先搞懂foo()(bar)的本质

这是Go里的连续函数调用,核心逻辑分两步:

  1. 先执行foo(),这个函数的返回值必须是一个函数类型;
  2. 立刻用第一步得到的函数,传入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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 13:01:10