Golang: функция в качестве аргумента, доступ к внутреннему параметру (fasthttp)
Пакет valyala / fasthttp реализует следующий тип функции:
type RequestHandler func(ctx *RequestCtx)
Он используется в buaazp / fasthttprouter следующим образом:
func (r *Router) Handle(method, path string, handle fasthttp.RequestHandler) {
//...
}
Я пытаюсь обернуть это так (открыть для предложений по реализации):
//myapp/router
type Request struct {
fasthttp.RequestCtx
}
type RequestHandler func(*Request)
func Handle(method string, path string, handler RequestHandler) {
//I need to access the fasthttp.RequestCtx stuff in here...
}
Как мне этого добиться? Или, если это совсем не так, как я могу достичь своей цели, как указано ниже для пакета маршрутизатора?
ФОН
Цель: я хочу обернуть пакеты инструментов (сессии, базы данных, маршрутизацию и т. Д.), Чтобы сделать мое приложение независимым от реализации этих пакетов. Я хочу сделать это, прежде всего, с целью расширения их с помощью функциональности, специфичной для домена, и возможности переключения одной сторонней библиотеки на другую, если мне когда-либо понадобится это сделать. Это также облегчает отладку и ведение журнала.
Метод: я создаю нативные типы и функции, которые соответствуют функциональности импортированных пакетов.
Проблема: я застрял на том, как правильно обернуть внешний (то есть импортированный) тип функции.
1 ответ
Вообще ваша идея выглядит очень хорошо. Некоторые вещи, которые вы могли бы изменить:
//myapp/router
// Using a composition is idiomatic go code
// this should work. It can't get better.
type Request struct {
fasthttp.RequestCtx
}
// I would make the RequestHandler as a real Handler. In go it would be
// a interface
type RequestHandler interface{
Request(*Request)
}
// If you have a function, which needs to access parameters from `Request`
// you should take this as an input.
func Handle(method string, path string, req *Request) {
//Access Request via req.Request ...
}
Потому что, если вы передаете функцию или интерфейс в вашу функцию, которая также требует Request
в качестве входных данных вызывающий должен создать это, прежде чем он вызовет вашу функцию Handle. Почему бы не изменить эту функцию только для ввода, который вам действительно нужен?