Golang:函数作为参数,访问内部参数(fasthttp)

时间:2017-03-11 11:41:41

标签: go function-literal 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 个答案:

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