路由分组主要是用类似于链表的方法进行实现的
首先要定义一个路由分组的struct
prefix用于保存当前的一个路由前缀
parent用于指向父分组
engine用于指向总Engine中存储的路由信息
然后重新修改gee.go中的内容,完成路由分组的操作
package gee
import (
"net/http"
)
// HandlerFunc
// 处理HTTP请求的函数
type HandlerFunc func(ctx *Context)
type Engine struct {
//匿名字段,继承RouterGroup所有的字段和方法
*RouterGroup
//映射请求路径对应的函数
router *router
groups []*RouterGroup
}
// 创建一个分组
func (group *RouterGroup) Group(prefix string) *RouterGroup {
engine := group.engine
r := &RouterGroup{
prefix: engine.prefix + prefix,
parent: group,
engine: engine,
}
engine.groups = append(engine.groups, r)
return r
}
// 创建一个新Engine
func NewEngine() *Engine {
engine := &Engine{
router: newRouter(),
}
engine.groups = []*RouterGroup{engine.RouterGroup}
engine.RouterGroup = &RouterGroup{engine: engine}
return engine
}
// 启动服务
func (e *Engine) Run(port string) {
for key, node := range e.router.trie {
println(key)
node.Print(0)
}
http.ListenAndServe(port, e)
}
// 添加路径映射
func (router *RouterGroup) addRouter(method string, pattern string, handlerFunc HandlerFunc) {
router.engine.router.addRouter(method, router.prefix+pattern, handlerFunc)
}
// 添加GET请求
func (router *RouterGroup) GET(pattern string, handlerFunc HandlerFunc) {
router.addRouter("GET", pattern, handlerFunc)
}
// 添加POST请求
func (router *RouterGroup) POST(pattern string, handlerFunc HandlerFunc) {
router.addRouter("POST", pattern, handlerFunc)
}
// 实现Handler接口中的ServerHTTP方法
func (e *Engine) ServeHTTP(w http.ResponseWriter, r *http.Request) {
e.router.handler(NewContext(w, r))
}