概述
RouterGroup就是根据不同的basepath,对路由进行分组,并实现了各种路由处理接口,包括各种HTTP方法的处理接口,以及三个文件(StaticFile、Static、StaticFS)处理接口
定义
IRoutes定义了所有的路由处理接口
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
type IRoutes interface {
Use(...HandlerFunc) IRoutes
Handle(string, string, ...HandlerFunc) IRoutes
Any(string, ...HandlerFunc) IRoutes
GET(string, ...HandlerFunc) IRoutes
POST(string, ...HandlerFunc) IRoutes
DELETE(string, ...HandlerFunc) IRoutes
PATCH(string, ...HandlerFunc) IRoutes
PUT(string, ...HandlerFunc) IRoutes
OPTIONS(string, ...HandlerFunc) IRoutes
HEAD(string, ...HandlerFunc) IRoutes
StaticFile(string, string) IRoutes
Static(string, string) IRoutes
StaticFS(string, http.FileSystem) IRoutes
}
|
RouterGroup实现了以上所有定义的接口,它的结构体定义如下:
1
2
3
4
5
6
|
type RouterGroup struct {
Handlers HandlersChain //中间件handlers
basePath string //路由组的公共前缀
engine *Engine //gin的框架引擎
root bool
}
|
实现
可以使用Use方法在group中添加中间件,Use方法经常使用,比如添加log中间件和auth中间件
1
2
3
4
|
func (group *RouterGroup) Use(middleware ...HandlerFunc) IRoutes {
group.Handlers = append(group.Handlers, middleware...)
return group.returnObj()
}
|
Group方法可以实现在RouterGroup中再创建一个新的RouterGroup,把原basePath和新的相对路径relativePath组合成一个绝对路径作为新的basePath,新Handlers也是与原Handlers组合而成
1
2
3
4
5
6
7
|
func (group *RouterGroup) Group(relativePath string, handlers ...HandlerFunc) *RouterGroup {
return &RouterGroup{
Handlers: group.combineHandlers(handlers),
basePath: group.calculateAbsolutePath(relativePath),
engine: group.engine,
}
}
|
最后讲一下RouterGroup的核心方法handle,实现如下:
1
2
3
4
5
6
|
func (group *RouterGroup) handle(httpMethod, relativePath string, handlers HandlersChain) IRoutes {
absolutePath := group.calculateAbsolutePath(relativePath)
handlers = group.combineHandlers(handlers)
group.engine.addRoute(httpMethod, absolutePath, handlers)
return group.returnObj()
}
|
方法需传入HTTP方法,相对路径以及handlers,然后计算出绝对值路径和添加了中间件的新handlers,最后调用engine的添加路由方法addRoute,实际就是根据HTTP方法插入到对应的radix tree中去