在Golang中将接口类型实现为功能类型

时间:2019-01-14 06:12:27

标签: go interface

我创建了几种类型的接口,包括:

// 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

1 个答案:

答案 0 :(得分:0)

重点是: 如果您有

之类的功能
func A(param interface{}) {}

您可以在调用函数A时将任何内容传递给param,例如

A(10)
A(true)
A(nil)

因为界面{}意味着一切。因此,您的句柄函数定义为:

type GetProfileHandlerFunc func(GetProfileParams, interface{}) middleware.Responder

表示一个函数Ge​​tProfileHandlerFunc,它带有两个参数,第一个是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.
}