使用gin的Demo
r := gin.New()
r.GET("/user/:name", routeUser)
func routeUser(c *gin.Context){
//todo something
}
其中
r := gin.New()
生成了一个Engine对象,也包含了对路由的操作和许多成员变量,其中包括路由要执行的任务链Handlers HandlersChain,方法树trees methodTrees等。
r.Get第一个参数是相对路径路由,第二个参数就是这个路由要执行的方法
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()
}
这里的
group.calculateAbsolutePath(relativePath) 将相对路径转化为绝对路径
group.combineHandlers(handlers) 将路由方法放到handlersChain结构中去 这里做了函数总个数的校验就直接返回了
group.engine.addRoute(httpMethod, absolutePath, handlers)
这里的addRoute实际上是把handler挂在一个查找树上,这里看root的结构
这里的node下有多个node数组。
在http访问时,会去从root节点进入查找对应path的node,然后找到其handlers:
主要代码tree.go=>getValue():