通过给出key来调用map [string] interface {}中的函数

时间:2015-06-30 22:40:10

标签: go

我希望能够将函数名称传递给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)

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

1 个答案:

答案 0 :(得分:2)

ss["auth"].(*StatusService).Ping(myCtxInstance)几乎适用于任何类型,问题在于您未能断言事物的类型。在这种情况下,你需要像...... func(ctx *gin.Context)这样的东西。这个答案有一个更彻底的例子,我不会重复; Go map of functions

结合其他事物;如果您的真实用例与您的示例一样简单,只需停止您正在执行的操作并添加map[string]func(argumentType)作为第二个参数。此外,根据您要使用的函数的性质(如果它们都具有相同的args和返回类型),您可能希望为委托使用第二个arg,[Route("~/api/v1/portfolio/{id}/credentials")] [ResponseType(typeof(IEnumerable<CredentialsModel>))] public IEnumerable<CredentialsModel> GetByPortfolioId(int id) { return _repository.FindByPortfolioId(id); } 更合适。< / p>

您目前的设计将所有错误推送到运行时,这显然不如您从上面提到的任何选项中获得的编译时安全性。