2015-06-30 8 views
-2

Я хочу, чтобы иметь возможность передать имя функции gin.Engine route handler. У меня есть следующий код;вызов функции с карты [строка] интерфейс {} путем предоставления ключа

// status service 
type StatusService struct { 
    App *gin.Engine 
} 

func (s *StatusService) Ping(ctx *gin.Context) { 
    ctx.JSON(200, gin.H{ 
     "message": "pong", 
    }) 
} 

app := gin.Default() 
// define services 
statusService := &services.StatusService{ 
    App: app, 
} 
ss := make(map[string]interface{}) 
ss["auth"] = statusService 

app.GET("/ping", ss["auth"].Ping) 

Компилятор выдает следующую ошибку;

./app.go:60: ss["auth"].Ping undefined (type interface {} has no field or method Ping) 

Любые идеи о том, как исправить это?

ответ

2

interface{} работает практически для любого типа, проблема в том, что вы не смогли утверждать, какой тип вещи есть. В этом случае вам понадобится что-то вроде ... ss["auth"].(*StatusService).Ping(myCtxInstance). Этот ответ содержит более подробный пример, который я воздержу от дублирования; Go map of functions

Пара других вещей; если ваш реальный пример использования так же прост, как ваш пример, просто прекратите свое действие и добавьте func(ctx *gin.Context) в качестве второго аргумента. Кроме того, в зависимости от характера функций, которые вы хотите использовать (например, если все они имеют одинаковые аргументы и возвращаемые типы), вы можете захотеть использовать второй аргумент для делегатов, более подходящим будет map[string]func(argumentType).

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

+0

ну, мне не нужно определять структуру карты. Я могу инициализировать var и передать его функцию 'app.GET()'. Удобнее ли это использовать? – aacanakin

+0

btw, 'ss [" auth "]. (Func (ctx * gin.Context)). Ping' не работает – aacanakin

+0

@aacanakin да, было одно, что я действительно не замечал, что у вас есть тип 's * StatusService' для' Ping', поэтому вам действительно нужен тип assert для этого. Я обновлю этот пример. – evanmcdonnal

Смежные вопросы