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. Почему бы не изменить эту функцию только для ввода, который вам действительно нужен?

Другие вопросы по тегам