Go语言 将函数作为参数传递给另一个函数[已关闭]

qltillow  于 2022-12-28  发布在  Go
关注(0)|答案(2)|浏览(207)

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) {

}
6ss1mwsb

6ss1mwsb1#

不,在Context参数处理中没有什么特别的,它和其他参数一样。
router.POST("/signin", authHandler.SignInHandler)不是authHandler.SignInHandler函数调用(注意末尾没有()),而是将该函数作为HandlerFunc类型的参数传递给router.POST(),以供以后调用(处理路由时)。
当服务器正在处理对该路由请求时;一个handler函数将被运行(通过gin),并且在引擎盖下,它确实会像往常一样被Context参数调用。Context将由调用者提供(通常是中间件或http服务器)。
请参阅小demonstration in playground,它展示了这个概念,但没有复杂的gin代码库。

blmhpbnm

blmhpbnm2#

在示例中,函数不需要参数,因为代码不会显式调用函数。函数调用按照调用语法进行,以(开始,以)结束,中间有参数(如果有)。
函数是Go语言中的第一类值,所以你可以直接引用它们,而不需要调用它们。

func myFunc() {
    fmt.Println("Hello")
}

func main() {
    fmt.Println("- Beginning")

    // Assign the function to a variable.
    var someFuncVar = myFunc

    fmt.Println("- Middle")

    // Now call the function variable.
    someFuncVar()

    fmt.Println("- End")
}

输出:

- Beginning
- Middle
Hello
- End

Try it yourself
authHandler.SignInHandler在技术上被称为“方法值”(在这里定义),这是一个稍微高级一点的版本。通过示例(authHandler)引用方法名(SignInHandler),可以得到一个绑定到该特定示例的函数值。
下面是语言规范中更正式的定义:
如果表达式x具有静态类型T,并且M在类型T的方法集中,则x.M被称为方法值。方法值x.M是可使用与x. M的方法调用相同的参数来调用的函数值。表达式x在方法值的求值期间被求值并保存;然后,所保存的副本被用作任何呼叫中的接收者,所述呼叫可以稍后执行。

相关问题