gin源码阅读【4】-路由

gin的路由涉及到几个比较核心的属性,Engine,RouterGroup,trees,*node。

路由相关的核心结构如下:

engine结构图

tree

tree结构是一个数组,两个元素,就是method和node,请求方法和对应的路由,理论上因为http一共9种method,这里应该就最多9个元素吧:

tree结构

node

node就是一个具体的路由和指向的函数了

type node struct {
    path      string           // 当前节点相对路径(与祖先节点的 path 拼接可得到完整路径)
    indices   string           // 所以孩子节点的path[0]组成的字符串
    children  []*node          // 孩子节点
    handlers  HandlersChain    // 当前节点的处理函数(包括中间件)
    priority  uint32           // 当前节点及子孙节点的实际路由数量
    nType     nodeType         // 节点类型
    maxParams uint8            // 子孙节点的最大参数数量
    wildChild bool             // 孩子节点是否有通配符(wildcard)
}

node使用的是一个前缀树

比如:

r.GET("/", func(context *gin.Context) {})
r.GET("/index", func(context *gin.Context) {})
r.GET("/inter", func(context *gin.Context) {})
r.GET("/go", func(context *gin.Context) {})
r.GET("/game/:id/:k", func(context *gin.Context) {})

实际表现是:

路有树

如此这般就和前面的httpServe的对接上了,golang实现了一个路由表trees,然后路由表和httpServe匹配就是先了分发了。

发布于