GIN 路由分析
第一步:gin.Default
这个会返回一个Engine,Engine的结构如下
其中RouterGroup也是与路由有关的结构体,它的结构体如下
第二步:r.GET()
r.get就是路由注册和路由处理。
r.GET里面的方法就是group.handle就是咱由处理,handle的处理函数
里面的addRoute这个函数把方法,URI,处理handler 加入进来, 这个函数主要代码如下
Radix Tree基数树
Radix Tree,基数特里树或压缩前缀树,是一种更节省空间的 Trie 树。它对 trie 树进行了压缩
Trie树简介
Trie,被称为前缀树或字典树,是一种有序树,其中的键通常是单词和字符串,所以又有人叫它单词查找树。
它是一颗多叉树,即每个节点分支数量可能为多个,根节点不包含字符串。
从根节点到某一节点,路径上经过的字符连接起来,为该节点对应的字符串。
除根节点外,每一个节点只包含一个字符。
每个节点的所有子节点包含的字符都不相同。
优点:利用字符串公共前缀来减少查询时间,减少无谓的字符串比较
看看是咋压缩的,假如有下面一组数据 key-val 集合:
用上面的数据构造成一个trie树
把上图结点数小于2的进行压缩,如下
现在压缩 trie 树(Compressed Trie Tree)中的唯一子节点,就可以构建一颗 radix tree 基数树。
在另外看一张出现次数比较多的 Radix Tree 的图:
(图Radix_tree 来自:https://en.wikipedia.org/wiki/Radix_tree)
基数树的应用场景
httprouter 中的路由器。
使用 radix tree 来构建 key 为字符串的关联数组。
很多构建 IP 路由也用到了 radix tree,比如 linux 中,因为 ip 通常有大量相同前缀。
Redis 集群模式下存储 slot 对应的所有 key 信息,也用到了 radix tree。文件 rax.h/rax.c 。
radix tree 在倒排索引方面使用也比较广。
httpRouter中的基数树
node的结点如下
结点类型nodeType的结构体如下
addRoute的逻辑代码比较少,这里主要分空树插入和非空树插入,空树插入的代码如下
非空树的处理:
标签:分析,radix,tree,Radix,字符串,GIN,节点,路由 From: https://www.cnblogs.com/lisus2000/p/17684833.html