我创建了几种类型的接口,包括:
// GetProfileHandlerFunc turns a function with the right signature into a get profile handler
type GetProfileHandlerFunc func(GetProfileParams, interface{}) middleware.Responder
// Handle executing the request and returning a response
func (fn GetProfileHandlerFunc) Handle(params GetProfileParams, principal interface{}) middleware.Responder {
return fn(params, principal)
}
// GetProfileHandler interface for that can handle valid get profile params
type GetProfileHandler interface {
Handle(GetProfileParams, interface{}) middleware.Responder
}
现在在我的api实现包中。我正在使用一种逻辑来处理请求参数。我正在尝试将GetProfileHandlerFunc
分配给另一种类型,因为它实现了GetProfileHandler
接口,如上所示。
api.ProfileGetProfileHandler = profile.GetProfileHandlerFunc(func(params profile.GetProfileParams, principal *models.User) middleware.Responder {
// contains logic to handle the request
}
现在,我想我可以做得比逻辑更好。但是我收到类型不匹配错误。
无法转换函数文字(类型为func(profile.GetProfileParams, *“ userproj / models”。用户) middleware.Responder)来输入profile.GetProfileHandlerFuncgo
答案 0 :(得分:0)
重点是: 如果您有
之类的功能func A(param interface{}) {}
您可以在调用函数A时将任何内容传递给param,例如
A(10)
A(true)
A(nil)
因为界面{}意味着一切。因此,您的句柄函数定义为:
type GetProfileHandlerFunc func(GetProfileParams, interface{}) middleware.Responder
表示一个函数GetProfileHandlerFunc,它带有两个参数,第一个是GetProfileParams类型,第二个是interface {}类型。这意味着第二个参数可以是任何东西。
但是
func(params profile.GetProfileParams, principal *models.User) middleware.Responder
表示一个具有两个参数的函数,第一个是GetProfileParams类型,第二个是* models.User类型。那么,您认为它们是相同的吗?否
我需要一个可以将任何东西作为第二个参数的函数,而不是一个只能将User作为第二个函数的函数。
当您呼叫手柄时
GetProfileHandlerFunc(params, 10) // this is ok
这样
可以吗func(params profile.GetProfileParams, principal *models.User) middleware.Responder
否。
正确的方法是:
api.ProfileGetProfileHandler = profile.GetProfileHandlerFunc(func(params profile.GetProfileParams, principal interface) middleware.Responder {
user:=principal.(*model.User) // watch this.
}