• 概述
  • RouterGroup
    • 定义
    • 实现

概述

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中去