繁体   English   中英

在 Golang 中实现接口类型到函数类型

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM