0

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...
}

我怎样才能做到这一点?或者,如果这根本不是要走的路,我怎样才能达到下面提到的路由器包的目标?


背景

目标:我的愿望是包装工具包(会话、数据库、路由等),以使我的应用程序与这些包的实现无关。我希望这样做主要是为了能够使用特定于域的功能来扩展它们,并且能够将一个 3rd 方库切换到另一个库,如果我需要这样做的话。它还使调试和记录更容易。

方法:我创建本地类型和函数,它们映射到导入包的功能。

问题:我被困在如何正确包装外来(即导入)函数类型上。

4

1 回答 1

0

总而言之,您的想法看起来非常好。你可以改变的一些事情:

//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 函数之前创建它。为什么不只为您真正需要的输入更改该功能?

于 2017-03-11T12:02:24.497 回答