Gin框架源码解析
一、Radix树的介绍
1、基本概念:基数树又被称为PAT树,是一种更省空间的前缀树,对于基数树的每个节点,如果节点是唯一的子树的话,就和父节点合并,比如如下的字母,都有r开头,所以r为总父节点,然后依次排序下去。
应用:关键词猜想(输入字就联想),屏蔽一些关键词
二、Gin中请求处理路由路径的实现
根据Get方法的路由,按照PAT树的规则来寻找路径
由此可以看处Gin就是一棵树,通过PAT树一层一层的寻找到
三、请求方法树底层解析
定义了容量为9的切片,里面储存http获取请求的9个方法
通过遍历trees的切片而不是map,当传入的方法和切片中某一个方法相同的时候,返回结构体指针
func (trees methodTrees) get(method string) *node {
for _, tree := range trees {
if tree.method == method {
return tree.root
}
}
return nil
}
四、中间价的详解
1、默认中间件
2、c.Next()函数
解释:c.Next就是一个遍历过程,当func1 before执行完成之后不会直接执行func1 after,会通过c.Next遍历跳转到func2中执行func2 before函数
五、Context、Set、Get
1、Context
就像是一条线,将所有的方法都串在一起
2、Set方法
func (c *Context) Set(key string, value interface{}) {
c.mu.Lock()
if c.Keys == nil {
c.Keys = make(map[string]interface{})
}
c.Keys[key] = value
c.mu.Unlock()
}
通过Set方法储存值,后续可以通过Get方法获取值
3、Get方法
func (c *Context) Get(key string) (value interface{}, exists bool) {
c.mu.RLock()
value, exists = c.Keys[key]
c.mu.RUnlock()
return
}
通过Get方法取值之后,需要进行类型断言转换,因为返回的是一个空接口类型
如果看完对自己有所帮助,请点赞支持