- 中间件控制器
- 路由
- Context
- 分组控制
路由
路径参数和查询参数最佳实践:RESTful API设计的最佳实践是使用路径参数来标识一个或多个特定资源,而使用查询参数来对这些资源进行排序/过滤。
基于httprouter实现的路由器,底层基于前缀树,https://learnku.com/articles/27591

普通字典树每个节点存一个字符,router采用了压缩字典树,
使用压缩字典树可以减少树的层数,同时因为每个节点上数据存储也比通常的字典树要多,所以程序的局部性较好(一个节点的path加载到cache即可进行多个字符的对比),从而对CPU缓存友好。
node结构
path: 当前节点对应的路径中的字符串 wildChild: 子节点是否为参数节点,即 wildcard node,或者说 :id 这种类型的节点 nType: 当前节点类型,有四个枚举值: 分别为 static/root/param/catchAll。 static // 非根节点的普通字符串节点 root // 根节点 param // 参数节点,例如 :id catchAll // 通配符节点,例如 *anyway indices:子节点索引,当子节点为非参数类型,即本节点的wildChild为false时,会将每个子节点的首字母放在该索引数组。说是数组,实际上是个string。例子:

// 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方法