gin源码解析?什么是字典树?

介绍

gin 框架 基于 httprouter 实现最重要的路由模块,采用类似字典树一样的数据结构来存储路由与handle方法的映射.也是框架高性能的原因,有兴趣的同学可以自行查阅

本文提供 在线思维导图 搭配文章看事半功倍

Engine 容器对象,整个框架的基础

Engine.trees 负责存储路由和handle方法的映射,采用类似字典树的结构

Engine.RouterGroup,其中的Handlers存储着所有中间件

Context上下文对象,负责处理请求和回应,其中的handlers是存储处理请求时中间件和处理方法的

初始化容器

通过调用 gin.New() 方法来实例化Engine.
虽然参数很多,但我们只需要注意 RouterGroup ,trees和 engine.pool.New即可

  • engine.pool.New 负责创建Context对象,采用sync.Pool减少频繁context实例化带来的资源消耗,

注册中间件

gin的高性能主要依靠trees,每一个节点的内容你可以想象成一个key->value的字典树,key是路由,value则是一个[]HandlerFunc,里面存储的就是按顺序执行的中间件和handle控制器方法,这里很重要,要考!

注册全局中间件

gin.use() 调用RouterGroup.Use()RouterGroup.Handlers写入记录

注册路由组中间件

通过 Group()方法返回一个 新生成的RouterGroup指针,用来分开每个路由组加载不一样的中间件

注意这里的Handlers: group.combineHandlers(handlers),这行代码会复制一份全局中间件到新生成的RouterGroup.Handlers中,接下来路由注册的时候就可以一起写入树节点中

注册路由以及中间件

不管哪种请求方式最终都会调用RouterGroup.handle,这个方法主要有两个作用

处理路由的格式,将路由拼成 ‘/’ 字符开头的路由

复制一份RouterGroup.Handlers,加上相应这次路由的handle方法,组成一个list放入树节点中

最后调用trees.addRoute增加节点

启动

通过调用net/http来启动服务,由于engine实现了ServeHTTP方法,只需要直接传engine对象就可以完成初始化并启动

处理请求

  • 这里只需要留意handleHTTPRequest(c *Context)方法就好了
  • 通过请求方法和路由找到相对应的树节点,获取储存的[]HandlerFunc列表,通过调用c.Next()处理请求
  • 通过不停的移动下标递归,最后完成处理返回结果

感想

  • gin框架源码算是比较简单易懂的,这恰恰就是他的优点,golang语言本身就比较成熟,框架只不过一个方便你做项目脚手架,你完全可以按照你的需求来定制你自己专属的gin框架,包括日志,缓存,队列等等
  • 核心是路由存储树,学好算法,数据结构才是关键

字典树是什么?

信息学奥林匹克竞赛中的较为常用的数据结构——字典树。字典树也叫Trie树、前缀树。顾名思义,它是一种针对字符串进行维护的数据结构。并且,它的用途超级广泛。建议大家熟练掌握。字典树就是一棵多叉树,只不过,这棵树的每条边上都有一个字母,然后这棵树的一些节点被指定成了标记节点(目标节点,不一定是叶子节点)而已。

字典树的功能

根据字典树的概念,我们可以发现:字典树的本质是把很多字符串拆成单个字符的形式,以树的方式存储起来。所以我们说字典树维护的是字典。那么根据这个最基本的性质,我们可以由此延伸出字典树的很多妙用。简单总结起来大体如下:

  • 1、维护字符串集合(即字典)。
  • 2、向字符串集合中插入字符串(即建树)。
  • 3、查询字符串集合中是否有某个字符串(即查询)。
  • 4、统计字符串在集合中出现的个数(即统计)。
  • 5、将字符串集合按字典序排序(即字典序排序)。
  • 6、求集合内两个字符串的LCPLongest Common Prefix,最长公共前缀)(即求最长公共前缀)。

我们可以发现,以上列举出的功能都是建立在字符串集合的基础上的。再一次强调,字典树是字典的树,一切功能都是字典的功能。这也为我们使用字典树的时候提供了一个准则:看到一大堆字符串同时出现,就往哈希和Trie树那边想一下。

参考文档

gin中文文档 https://gin-gonic.com/zh-cn/docs/introduction/

gin项目地址 https://github.com/gin-gonic/gin

httprouter https://github.com/julienschmidt/httprouter

————————————————

版权声明:本文为CSDN博主「luo1324574369」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/luo1324574369/article/details/108310032

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值