Получение обработчика go -gin FunFun c приемника указателя с использованием отражателя - PullRequest
0 голосов
/ 07 марта 2020

У меня проблема с получением HandlerFun c с отражением.

Ниже мой код:

type ServiceHandler struct {
    Name string
}

var handler *ServiceHandler

func init() {
   handler = ServiceHandler{Name: "test"}
}

func (handler *ServiceHandler) Handler1(c *gin.Context) {
   ...
}

func (handler *ServiceHandler) Handler2(c *gin.Context) {
   ...
}

Пока все хорошо. Теперь я использую рефлексию, чтобы перечислить все мои методы и передать их в gin router.

func listHanlderMethods() {
    handlerType := reflect.TypeOf(handler)
    for i := 0; i < handlerType.NumMethod(); i++ {
        method := handlerType.Method(i)
        fmt.Println(method.Name)
    }
}

, что дает Handler1 и Handler2 .

Мой вопрос здесь:

Как я могу получить HandlerFun c s с помощью отражения?

1 Ответ

1 голос
/ 07 марта 2020

Используйте значение, чтобы найти методы. Используйте утверждение типа, чтобы найти методы, соответствующие сигнатуре обработчика джина.

v := reflect.ValueOf(handler)
for i := 0; i < v.NumMethod(); i++ {
    if h, ok := v.Method(i).Interface().(func(*gin.Context)); ok {
        // Do something with h
    }
}

Запустите его на игровой площадке

...