• 中间件控制器
  • 路由
  • Context
  • 分组控制

路由

路径参数和查询参数最佳实践:RESTful API设计的最佳实践是使用路径参数来标识一个或多个特定资源,而使用查询参数来对这些资源进行排序/过滤。

基于httprouter实现的路由器,底层基于前缀树,https://learnku.com/articles/27591

image-20211130230140188

普通字典树每个节点存一个字符,router采用了压缩字典树,image-20211130230215740

使用压缩字典树可以减少树的层数,同时因为每个节点上数据存储也比通常的字典树要多,所以程序的局部性较好(一个节点的path加载到cache即可进行多个字符的对比),从而对CPU缓存友好。

  • node结构

    path: 当前节点对应的路径中的字符串
    
    wildChild: 子节点是否为参数节点,即 wildcard node,或者说 :id 这种类型的节点
    
    nType: 当前节点类型,有四个枚举值: 分别为 static/root/param/catchAll。
        static                   // 非根节点的普通字符串节点
        root                     // 根节点
        param                    // 参数节点,例如 :id
        catchAll                 // 通配符节点,例如 *anyway
    
    indices:子节点索引,当子节点为非参数类型,即本节点的wildChild为false时,会将每个子节点的首字母放在该索引数组。说是数组,实际上是个string

    例子:

    image-20211201000832469

// ServeHTTP conforms to the http.Handler interface.
func (engine *Engine) ServeHTTP(w http.ResponseWriter, req *http.Request) {
	c := engine.pool.Get().(*Context)
	c.writermem.reset(w)
	c.Request = req
	c.reset()

	engine.handleHTTPRequest(c)

	engine.pool.Put(c)
}

Gin重写了http的ServeHTTP,这个是接收请求时执行的handle方法


文章作者: 永远的超神
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 永远的超神 !
  目录