[Gin]框架底层实现理解(一)

news2025/7/20 21:21:33

前言:路由原理———压缩字典

这边简单讲一下gin非常重要的一个基点,也就是他作为go web框架的一个亮点

也就是Trie树和压缩字典算法

gin 通过树来存储路由,讲路由的字符拆解为一个个的结点,在获取handler函数时,会根据路由来获取对应的结点,结点中包含了handler函数,根据结点来获取对应的handler函数

主要就是压缩字典算法:

正常的trie树的存储单个结点,一个结点一个字符,这样是非常耗空间的,但是如果使用压缩字典算法则是通过先找到共同公共前缀,再去找子结点,如此重复以上两个步骤,期间会对结点进行切分和重组形成新的结点,极大的节省了存储空间 

比如上图没有使用压缩字典树算法路由 /acd /at /bee 形成的树形结构,每个字母的父亲节点就是它的前一个字母

Trie树的三个性质:

  • 根节点不包含字符,除根节点外每一个节点都只包含一个字符

  • 从根节点到某一节点,路径上经过的字符连接起来,为该节点对应的字符串

  • 每个节点的所有子节点包含的字符都不相同

那么有了这样的一颗树,查找单词就变得很简单,从根节点开始向下匹配,如果匹配到单词的前缀就沿着该节点接着往下匹配,直到完全匹配到单词。

但是trie树的每个节点只能存储一个字符,这意味着面对较长的字符串仍然要向下探寻多个节点,这存在着浪费,因此就有了压缩字典树,

压缩字典树,是trie树的一种,也称单词查找树、前缀树,善于进行字符串的检索、取字符串最长公共前缀、以及排序,常应用在搜索引擎中例如百度输入某个字可能自动弹出能匹配到的单词出来。

以下分别是Trie树和压缩字典树:

 

显而易见的相同路径下,结点数量便少了很多

压缩字典树的特质使得其用于单词前缀查找时更快。这也恰巧就是一个高性能的路由匹配算法需要的。因此Gin使用其作为路由算法。

type node struct {
	path      string // 存储着节点的字符串
	indices   string // 存储着下级子节点的前缀索引 这边是作为数组切片用,按照子结点顺序,抽取其所有子结点首字符放入这里
    wildChild bool   //进行模糊匹配,例如有些是/user/:pid 这类的url,存储的结点遍历到/:pid时候就会判断是不是模糊匹配
    //如果你的url是user/1234 那么就会根据这个参数进行模糊匹配也就是 将1234填补:pid的位置
	nType     nodeType 
// nType 节点类型:
// static nodeType = iota // default,默认类型
// root 根节点
// param 参数,例如:id这样的通配符
// catchAll 全匹配
	priority  uint32  // 优先级  这个树的结点有权重比,一般是越上面的结点权重越高,具体看实现
	children  []*node // 子节点, 至少有一个, :param 类型的节点会在列表的末尾
	handlers  HandlersChain // 匹配该节点的路由的处理函数  一个结点可以有多个handle函数,也就是其名字带chain的意义
	fullPath  string        // 从根节点到该节点的完整路径  relativePath
}

 

下面通过引用一个博主的流程图直观解释添加结点的流程

插入操作 图解一串子串插入压缩trie过程,/,/serach,/support,/blog , 在httprouter上截的一段例子,我们只插到/blog

 插入/serach

 

插入/support

 

插入/blog

同第二步,查询后直接插入blog

——查询操作——

1、先找共同前缀。 2、再找目录。 3、循环上面两步,直到当前path相等。

gin中还根据不同的请求方法分为不同的树,例如get,post等方法都有各自独立的树,但是都同属于同一个根节点

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/395322.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

项目管理系统软件有哪些?这10款最好用的项目管理软件值得推荐

项目管理系统软件有哪些?这10款好用的项目管理系统软件值得推荐 如今企业规模不断扩大,业务逐渐复杂化,项目管理系统已经成为现代企业管理中不可或缺的一环; 而项目管理系统软件不仅可以保证项目按时完成,提高团队的…

【Java基础 下】 029 -- 多线程

目录 一、为什么要有多线程? 1、线程与进程 2、多线程的应用场景 3、小结 二、多线程中的两个概念(并发和并行) 1、并发 2、并行 3、小结 三、多线程的三种实现方式 1、继承Thread类的方式进行实现 2、实现Runnable接口的方式进行实现 3、利用…

MySQL简述

一、什么是数据库 数据库(DB,DataBase) 概念:数据仓库,相当于一款软件,安装在操作系统(Windows,Linux,mac,…)之上,可以存储大量的数…

nvm安装及使用(win)

一、安装nvm 下载地址:下载之后安装包安装 安装路径不要有中文或者空格 安装时尽量不要选择系统盘(安装在系统盘可能会涉及到权限问题) 安装前一定要把 node 的环境变量和 npm 的环境变量删除,否则在切换 node 版本时会报错 二、…

SCL_PFENET跑通填坑

1.数据准备:VOC2012数据集,initmodel文件夹(预训练模型),SegmentationClassAug数据2.训练部分:训练部分没什么需要改动的,也就改一下选择的配置文件。在config文件夹里有关于coco和voc数据的配置…

备战蓝桥杯Day3python——迭代器的使用

python封装的迭代器 我们接下来介绍用于返回笛卡尔积的Permutations函数 Permutations(iterator, r) r:表示进行迭代后返回的长度 实例: >>> from itertools import permutations >>> a abc >>> for i in permutations(a,3):print …

Java深拷贝,浅拷贝

一、浅拷贝: (1) 对于数据类型是基本数据类型的成员变量,浅拷贝会直接进行值传递,也就是将该属性复制一份给新的对象。因为是两份不同的数据,所以对其中一的对象的成员变量值进行修改,不会影响另…

大考在即 百度版ChatGPT会翻车吗?

文心一言的发布会定档3月16日,不出意外,百度创始人李彦宏、CTO王海峰将出现在北京总部的发布会现场。这是百度版ChatGPT最新的官方消息,2月7日,文心一言首次官宣,当时称,产品“3月见”。 3月如期而至&…

C语言再学习 -- __attribute__详解

一、attribute 介绍 __attribute__是一个编译属性,用于向编译器描述特殊的标识、错误检查或高级优化。它是GNU C特色之一,系统中有许多地方使用到。__attribute__可以设置函数属性(Function Attribute)、变量属性(Var…

JavaScript 如何优雅地获取多层级response中的某个深层次字段 ?. 可选链条(Optional chaining)

文章目录一句话场景:从一个多层级对象中拿一个处在深层次位置的字段MDN 可选链搜索引擎使用一句话 var marriedFlag response.data.userList[0].married; // 如果中间某个对象为空,会报Errorvar marriedFlag response?.data?.userList[0]?.married…

外贸新手找客户的开发信修炼之旅(一)

开发信是一种传统的开发海外客户的方式,相信即便是外贸新手也或多或少有所耳闻,甚至已经通过邮件开发到了一些有意向的客户,但有时也会遇到开发信效果不好的情况,收到的回复寥寥无几。其实说白了开发信的本质与派发传单相同&#…

李开复已经对美图公司失去耐心,并在美图公司身上损失惨重

来源:猛兽财经 作者:猛兽财经 猛兽财经经过对美图公司(01357)的投资人回报、产品、业务结构、战略、财务业绩、估值等方面进行了研究,认为美图这家公司不行,非常不看好,以下是理由供你参考。一…

10 Seata配置Nacos注册中心和配置中心

Seata配置Nacos注册中心和配置中心 Seata支持注册服务到Nacos,以及支持Seata所有配置放到Nacos配置中心,在Nacos中统一维护; 高可用(集群)模式下就需要配合Nacos来完成: 具体配置如下 注册中心 Seata-server端配置注册中心,…

【洛谷 P1219】[USACO1.5]八皇后 Checker Challenge 题解(深度优先搜索+回溯法)

[USACO1.5]八皇后 Checker Challenge 题目描述 一个如下的 666 \times 666 的跳棋棋盘,有六个棋子被放置在棋盘上,使得每行、每列有且只有一个,每条对角线(包括两条主对角线的所有平行线)上至多有一个棋子。 上面的布…

13_MySQL中的约束

目录 1. 约束(constraint)概述 1.1 为什么需要约束 1.2 什么是约束 1.3 约束的分类 2. 非空约束 2.1 作用 2.2 关键字 2.3 特点 2.4 添加非空约束 2.5 删除非空约束 3. 唯一性约束 3.1作用 3.2 关键字 3.3 特点 3.5 关于复合唯一约束 4. 主键(PRIMARY KEY)约束 4.1 作用 4.2 关…

【Django】Hello,DJango!

Halo,这里是Ppeua。平时主要更新C语言,C,数据结构算法......感兴趣就关注我吧!你定不会失望。 🌈个人主页:主页链接 🌈算法专栏:专栏链接 我会一直往里填充内容哒! &…

如何实现报表可视化,有没有工具推荐

随着数据量的不断增长,如何更好地进行数据分析和可视化已成为企业和组织面临的重要挑战。实现报表可视化是一个很好的解决方案,它可以帮助用户更好地理解和分析数据,发现趋势和模式,并支持数据驱动的决策。本文将介绍如何实现报表…

现代卷积神经网络(NiN),并使用NIN训练CIFAR10的分类

专栏:神经网络复现目录 本章介绍的是现代神经网络的结构和复现,包括深度卷积神经网络(AlexNet),VGG,NiN,GoogleNet,残差网络(ResNet),稠密连接网络…

【3.7】Redis数据类型、CPU缓存一致性、哈希表

文章目录数据类型篇StringListHashSetZsetBitMapHyperLogLogGEOStreamCPU 缓存一致性CPU是如何执行任务的?什么是软中断?为什么0.1 0.2不等于0.3?哈希表数据类型篇 String String 是最基本的 key-value 结构,key 是唯一标识&…

03 | 授权服务:授权码和访问令牌的颁发流程是怎样的? 笔记

03 | 授权服务:授权码和访问令牌的颁发流程是怎样的? 授权服务的工作过程 小兔软件需要去到京东的平台那里”备案“注册,京东商家开放平台就会给小兔软件 app_id 和 app_secret 等信息,以方便后面授权时的各种身份校验&#xff0…