包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...
}
我怎样才能做到这一点?或者,如果这不是完全可行的方法,我如何实现下面提到的路由器包的目标?
背景
目标:我希望包装工具包(会话,数据库,路由等),以使我的应用程序与这些包的实现无关。我希望这样做主要是为了能够使用特定于域的功能扩展这些功能,并且能够将一个第三方库替换为另一个,如果我需要这样做的话。它还使调试和日志记录更容易。
方法:我创建了原生类型和函数,这些类型和函数映射到导入包的功能。
问题:我坚持如何正确包装外国(即导入的)功能类型。
答案 0 :(得分: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函数之前创建它。为什么不仅仅根据您真正需要的输入更改该功能?