gin路由源码阅读记录

使用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():
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值