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

I have created few types including interface as:

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

Now in my api implementation package. I am using a logic to handle the request parameters. I am trying to assign GetProfileHandlerFunc to another type since it implements GetProfileHandler interface as you can see above.

api.ProfileGetProfileHandler = profile.GetProfileHandlerFunc(func(params profile.GetProfileParams, principal *models.User) middleware.Responder {
     // contains logic to handle the request
}

Now I think I can do above logic. But I am getting type mismatch error.

cannot convert func literal (type func(profile.GetProfileParams, *"userproj/models".User) middleware.Responder) to type profile.GetProfileHandlerFuncgo

the point is: if you have a function like

func A(param interface{}) {}

you can pass anything to param when you make a call to function A. like

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

Because interface{} means everything. So your handle func definition:

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

means a function GetProfileHandlerFunc which takes two params, the first is of type GetProfileParams, the second is of type interface{}. That means second param canbe anything.

But

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

means a function which takes two params, the first is of type GetProfileParams, the second is of type *models.User. So, do you think they are the same? No.

I need a function can take anything as second param,not a function who can only take User as second function.

When you call your handle

GetProfileHandlerFunc(params, 10) // this is ok

So is that ok for

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

No.

The right way to do this is :

api.ProfileGetProfileHandler = profile.GetProfileHandlerFunc(func(params profile.GetProfileParams, principal interface) middleware.Responder {

     user:=principal.(*model.User) // watch this.
}