在我的项目中咱们很多时候会对一组的路由进行解决,咱们应该如何实现这个性能呢。目前来说,咱们进行的都是单个路由的解决。
分组的实现
明天的内容不是很多,咱们对router文件进行改在。
在分组的时候,给每个组要用本人的中间件,也就是共有的中间件,所以咱们首先实现一个构造体
type RouterGroup struct { prefix string middlewares []HandlerFunc // support middleware parent *RouterGroup // support nesting engine *Engine // all groups share a Engine instance}
而后engine要实现所以的性能,所以咱们要进行一个革新:
func New() *Engine { engine := &Engine{router: newRouter()} engine.RouterGroup = &RouterGroup{engine: engine} engine.groups = []*RouterGroup{engine.RouterGroup} return engine}
而后上面是咱们是咱们总体的代码:
package geeimport ( "log" "net/http")type RouterGroup struct { prefix string middlewares []HandlerFunc // support middleware parent *RouterGroup // support nesting engine *Engine // all groups share a Engine instance}// HandlerFunc defines the request handler used by geetype HandlerFunc func(*Context)// Engine implement the interface of ServeHTTPtype Engine struct { *RouterGroup router *router groups []*RouterGroup // store all groups}// New is the constructor of gee.Enginefunc New() *Engine { engine := &Engine{router: newRouter()} engine.RouterGroup = &RouterGroup{engine: engine} engine.groups = []*RouterGroup{engine.RouterGroup} return engine}// Group is defined to create a new RouterGroup// remember all groups share the same Engine instancefunc (group *RouterGroup) Group(prefix string) *RouterGroup { engine := group.engine newGroup := &RouterGroup{ prefix: group.prefix + prefix, parent: group, engine: engine, } engine.groups = append(engine.groups, newGroup) return newGroup}func (group *RouterGroup) addRoute(method string, comp string, handler HandlerFunc) { pattern := group.prefix + comp log.Printf("Route %4s - %s", method, pattern) group.engine.router.addRoute(method, pattern, handler)}// GET defines the method to add GET requestfunc (group *RouterGroup) GET(pattern string, handler HandlerFunc) { group.addRoute("GET", pattern, handler)}// POST defines the method to add POST requestfunc (group *RouterGroup) POST(pattern string, handler HandlerFunc) { group.addRoute("POST", pattern, handler)}// Run defines the method to start a http serverfunc (engine *Engine) Run(addr string) (err error) { return http.ListenAndServe(addr, engine)}//这里就是最初的处理函数,这里开始建设的上下文。func (engine *Engine) ServeHTTP(w http.ResponseWriter, req *http.Request) { c := newContext(w, req) engine.router.handle(c)}