Go函数调用如何推断参数值?Gin路由传handler无显式参数为何能运行
原理说明
- 你调用
router.GET("/", baseHandler)时并没有执行baseHandler,只是将这个函数作为可执行的引用值注册到Gin的路由规则中,因此不需要传递参数。
详细逻辑拆解
- 类型匹配规则
Gin中路由方法接收的Handlers参数本质是HandlerFunc类型的集合,HandlerFunc的内置定义为:
type HandlerFunc func(*gin.Context)
你自定义的baseHandler函数签名和HandlerFunc完全匹配,因此可以直接作为值传入路由方法,这个特性和你熟悉的Java方法引用、lambda传递逻辑一致,属于编程语言将函数作为一等公民的常规用法。
- 函数实际执行时机
当你调用router.Run()启动HTTP服务后,Gin会持续监听指定端口的请求:
- 收到匹配
GET /路径的请求时,Gin会自动构建包含请求头、请求参数、响应实例等所有请求上下文信息的*gin.Context对象 - 之后Gin内部会主动调用你提前注册的
baseHandler,将构建好的*gin.Context作为参数传入,此时才会真正执行你编写的返回JSON的业务逻辑
你可以用Java的常用逻辑类比:给集合forEach方法传递System.out::println方法引用时,你不需要当场给println传参数,是forEach遍历到每个元素时,自动把元素作为参数调用你传入的方法引用,Gin的路由注册逻辑和这个完全相同。
内容的提问来源于stack exchange,提问作者letthefireflieslive
相关产品推荐
相关产品推荐

