- 已关闭**。此问题需要details or clarity。当前不接受答案。
- 想要改进此问题?**添加详细信息并通过editing this post阐明问题。
4天前关闭。
Improve this question
- 原件**
如何不传递参数就调用函数SignInHandler
期望一个*gin.Context
类型的参数,但是在函数调用authHandler.SignInHandler
时没有显式传递,是否有某种隐式传递或上下文的特殊情况,我不确定。
- 更新**
我最初以为它是调用函数,但它只是传递函数引用。
main.go
package main
var authHandler *handlers.AuthHandler
func init() {
ctx := context.Background()
authHandler = &handlers.AuthHandler{}
}
func main() {
router := gin.Default()
router.POST("/signin", authHandler.SignInHandler)
}
auth.go
type AuthHandler struct{}
func (handler *AuthHandler) SignInHandler(c *gin.Context) {
}
2条答案
按热度按时间6ss1mwsb1#
不,在
Context
参数处理中没有什么特别的,它和其他参数一样。router.POST("/signin", authHandler.SignInHandler)
不是authHandler.SignInHandler
函数调用(注意末尾没有()
),而是将该函数作为HandlerFunc
类型的参数传递给router.POST()
,以供以后调用(处理路由时)。当服务器正在处理对该路由请求时;一个handler函数将被运行(通过
gin
),并且在引擎盖下,它确实会像往常一样被Context
参数调用。Context
将由调用者提供(通常是中间件或http服务器)。请参阅小demonstration in playground,它展示了这个概念,但没有复杂的gin代码库。
blmhpbnm2#
在示例中,函数不需要参数,因为代码不会显式调用函数。函数调用按照调用语法进行,以
(
开始,以)
结束,中间有参数(如果有)。函数是Go语言中的第一类值,所以你可以直接引用它们,而不需要调用它们。
输出:
Try it yourself
authHandler.SignInHandler
在技术上被称为“方法值”(在这里定义),这是一个稍微高级一点的版本。通过示例(authHandler
)引用方法名(SignInHandler
),可以得到一个绑定到该特定示例的函数值。下面是语言规范中更正式的定义:
如果表达式x具有静态类型T,并且M在类型T的方法集中,则x.M被称为方法值。方法值x.M是可使用与x. M的方法调用相同的参数来调用的函数值。表达式x在方法值的求值期间被求值并保存;然后,所保存的副本被用作任何呼叫中的接收者,所述呼叫可以稍后执行。