猿问

通过提供键从 map[string]interface{} 调用函数

我希望能够将函数名称传递给 gin.Engine 路由处理程序。我有以下代码;


// status service

type StatusService struct {

    App *gin.Engine

}


func (s *StatusService) Ping(ctx *gin.Context) {

    ctx.JSON(200, gin.H{

        "message": "pong",

    })

}


app := gin.Default()

// define services

statusService := &services.StatusService{

    App: app,

}

ss := make(map[string]interface{})

ss["auth"] = statusService


app.GET("/ping", ss["auth"].Ping)

编译器给出以下错误;


./app.go:60: ss["auth"].Ping undefined (type interface {} has no field or method Ping)

关于如何解决这个问题的任何想法?


长风秋雁
浏览 168回答 1
1回答

红糖糍粑

interface{}几乎适用于任何类型,问题是您未能断言该事物是哪种类型。在这种情况下,您将需要类似...的东西ss["auth"].(*StatusService).Ping(myCtxInstance)。这个答案有一个更彻底的例子结合其他事情;如果您的实际用例与您的示例一样简单,只需停止您正在做的事情并添加func(ctx *gin.Context)第二个参数即可。此外,根据您要使用的函数的性质(例如,如果它们都具有相同的 args 和返回类型),那么您可能希望为委托使用第二个 argmap[string]func(argumentType)会更合适。您当前拥有的设计将所有错误推送到运行时,这显然不如您从我上面提到的任何一个选项中获得的编译时安全性更可取。
随时随地看视频慕课网APP

相关分类

Go
我要回答