Реализация типа интерфейса для типа функции в Голанге - PullRequest
0 голосов
/ 14 января 2019

Я создал несколько типов, включая интерфейс:

// 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 / модель" .user) middleware.Responder) для ввода профиля. GetProfileHandlerFuncgo

1 Ответ

0 голосов
/ 16 января 2019

дело в том: если у вас есть такая функция, как

func A(param interface{}) {}

вы можете передать что угодно параметру при вызове функции A. как

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

Потому что интерфейс {} означает все. Итак, ваше определение функции func:

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

означает функцию GetProfileHandlerFunc, которая принимает два параметра, первый имеет тип GetProfileParams, второй имеет тип интерфейса {}. Это означает, что второй параметр может быть чем угодно.

Но

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.
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...