代码之家  ›  专栏  ›  技术社区  ›  Himanshu

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

  •  -1
  • Himanshu  · 技术社区  · 7 年前

    我创建了几种类型,包括界面:

    // 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 literal(类型func(profile.GetProfileParams, *“用户项目/模型”。(用户) 中间件。响应者)输入配置文件。GetProfileHandlerFungo

    1 回复  |  直到 7 年前
        1
  •  0
  •   Billy Yuan    7 年前

    重点是: 如果你有一个函数

    func A(param interface{}) {}
    

    在调用函数a时,可以将任何内容传递给param

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

    因为接口{}意味着一切。所以你的handle func定义:

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

    表示一个函数GetProfileHandlerFunc,它接受两个参数,第一个参数类型为GetProfileParams,第二个参数类型为interface{}。这意味着第二个参数可以是任何东西。

    但是

    func(params profile.GetProfileParams, principal *models.User) middleware.Responder
    

    表示采用两个参数的函数,第一个是GetProfileParams类型,第二个是*models类型。使用者那么,你认为他们是一样的吗?不

    我需要一个函数可以将任何东西作为第二个参数,而不是一个只能将用户作为第二个函数的函数。

    当你叫把手的时候

    GetProfileHandlerFunc(params, 10) // this is ok
    

    这对我来说可以吗

    func(params profile.GetProfileParams,principal*models.User)中间件。应答器
    

    正确的方法是:

    api.ProfileGetProfileHandler = profile.GetProfileHandlerFunc(func(params profile.GetProfileParams, principal interface) middleware.Responder {
    
         user:=principal.(*model.User) // watch this.
    }