深入解析gin框架路由设计

一、概述

很多人都熟悉gin框架,但是很多人并没有更深层次的挖掘gin的路由设计。web框架的核心是什么?一个就是路由,所以想更深的了解这个框架,首先就要去深入了解gin框架的路由。

二、源码

2.1 Engine结构体

type Engine struct {
	RouterGroup  //定义了 GET,POST 等路由注册方法
    ...
    trees            methodTrees //路由逻辑
    ...
}

2.2 trees

type methodTrees []methodTree

type methodTree struct {
	method string
	root   *node
}
type node struct {
	path      string  //当前节点的相对路径(与父节点的path拼接得到完成路径)
	indices   string //所有孩子节点组成的字符串
	wildChild bool  //孩子节点是否存在通配符
	nType     nodeType //节点类型
	priority  uint32  //当前节点以及孙子节点的路由数量
	children  []*node  //孙子节点
	handlers  HandlersChain //当前节点的处理函数(包括中间件)
	fullPath  string //原始path
}

通过上面的代码结构,我们发现了什么?我们看到了树结构。实际gin框架的路由设计是前缀树,如果不懂前缀树的,可以去看下前缀树的书籍。

三、node里的数据说明

3.1 path和indices

使用的是前缀树的逻辑,搜索引擎使用树的结构比较多

举例个例子说明:
如果我们存在2个路由。分别为/demo,/deny,你觉得根节点和子节点如何划分?
首先我们需要找到2个路由的共同点:de,indices就是子节点的字符串组合

  • 根节点
path:de
indices:mn
  • 子节点
path:mo
indices:
path:ny
indices:

3.2 handlers

handlers主要存储的主要是这个节点所有需要实现的中间件相关的方法。具体处理逻辑可以自己看下源码,这边就不做介绍了。

3.3 nType

gin的节点类型:

const (
    static nodeType = iota // 普通节点,默认
    root       // 根节点
    param      // 参数路由,比如 /demo/:test
    catchAll   // 匹配所有内容的路由,比如 /demo/*test
)

3.4 wildChild

如果孩子节点是通配符(*或者:),则该字段为 true。

你可能感兴趣的:(gin)