那么 Group 对象,还需要有访问 Router 的能力,为了方便,我们可以在 Group 中,保存一个指针,指向 Engine ,整个框架的所有资源都是由 Engine 统一协调的,那么就可以通过 Engine 间接地访问各种接口了。
所以,最后的 Group 的定义是这样的:
day4-group/gee/gee.go
1 2 3 4 5 6
RouterGroup struct { prefix string middlewares []HandlerFunc // support middleware parent *RouterGroup // support nesting engine *Engine // all groups share a Engine instance }
// New is the constructor of gee.Engine funcNew() *Engine{ engine := &Engine{router: newRouter()} engine.RouteGroup = &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 instance func(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 }
// GET defines the method to add GET request func(group *RouterGroup) GET(pattern string, handler HandlerFunc) { group.addRoute("GET", pattern, handler) }
// POST defines the method to add POST request func(group *RouterGroup) POST(pattern string, handler HandlerFunc) { group.addRoute("POST", pattern, handler) }