[英]Implementing interface type to function type in Golang
我创建了几种类型,包括接口:
// 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 文字(类型 func(profile.GetProfileParams, *"userproj/models".User) middleware.Responder)转换为类型 profile.GetProfileHandlerFuncgo
关键是:如果你有一个像
func A(param interface{}) {}
当您调用函数 A 时,您可以将任何内容传递给 param。
A(10)
A(true)
A(nil)
因为 interface{} 意味着一切。 所以你的句柄函数定义:
type GetProfileHandlerFunc func(GetProfileParams, interface{}) middleware.Responder
表示一个函数 GetProfileHandlerFunc,它接受两个参数,第一个是 GetProfileParams 类型,第二个是 interface{} 类型。 这意味着第二个参数可以是任何东西。
但
func(params profile.GetProfileParams, principal *models.User) middleware.Responder
表示接受两个参数的函数,第一个是 GetProfileParams 类型,第二个是 *models.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.
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.