- 使用前缀树实现动态路由匹配(dynamic route)
- 实现两种匹配模式
:name
和*filepath
Trie
树,主要是两个功能:插入insert
、查找search
,这两个功能完成后,前缀树可以作为一个模块抽离出来。- 将前缀树作为一个模块用于路由
router
之中。 - 动态匹配过程中,通配符动态匹配到的值需要进行存储,给
Context
结构体中加一个属性Params
用于保存动态匹配到的属性值。
- 实现路由分组控制功能,支持路由分组嵌套
- 路由分组方便后续加入中间件(
day5-middlewares
完成)
- 增加
RouterGroup
类,记录每一个路由分组 RouterGroup
同时嵌入Engine
中,Engine
作为整个框架顶层的分组,记录所有的路由分组信息。- 在
RouterGroup
中加入*Engine
属性,可以由任意一个路由分组到达作为顶层分组的Engine
中。
type Engine struct {
*RouterGroup //这里我不确定,是表示Engine本身也作为一个顶层的路由分组吗?
router *router
groups []*RouterGroup //存储所有的路由分组
}
type RouterGroup struct {
prefix string //路由组匹配前缀
middlewares []HandlerFunc //中间件
parent *RouterGroup //支持嵌套的路由分组
engine *Engine //所有的路由分组都共享一个Engine实例
}
- 设计并实现Web框架的中间件机制
- 实现一个超简单的通用
Logger
中间件(也就三两行代码)
- 每一个路由分组
RouterGroup
对象都有一个属性middlewares
(类型为[]HandlerFunc
)存储该分组的所有的中间件 - 进行路由匹配的时候,请求路径每匹配到一个路由分组就会把该路由分组的所有中间件加载到一个
slice
中,之后将该slice
作为一个Context
类型对象的handlers
属性值,再把该Context
对象交给全局的Engine
实例(也就是main
函数中创建的r := gee.New()
)执行
在一个地方写错了,找了几个小时的bug
v1 := r.Group("/v1")
这里我写成"v1"
了,furious
-实现Gee框架的错误处理机制,避免因为一个panic而整个服务崩溃
-简单处理,就是添加一个全局中间件recovery
我在gee
包中,想实现一个gee.Default()
函数返回一个默认的Engine
实例,就是想其中预先加入部分中间件,那就会引用到middlewares
包中的函数。
在gee
目录下的go.mod
文件里面引入middlewares
,同时我也已经在middlewares
包里面引入了gee
。 此时都没报错,但是我在day7-panic-recover
目录下的go.mod
引入gee
包和middlewares
包就会报错(因为在main
函数里面会用到gee.Default()
)