gin的是路由算法其实就是一个Trie树(也就是前缀树). 有关数据结构的可以自己去网上找相关资料查看.
我们在使用gin时通过下面的代码注册路由
<code>router.Use(gin.Recovery())</code>
在调用POST, GET, HEAD等路由HTTP相关函数时, 会调用handle函数
如果调用了中间件的话, 会调用下面函数
如果使用了Group的话, 会调用下面函数
重点关注下面两个函数:
综合来看, 在预处理阶段
1.在调用中间件的时候, 是将某个路由的handler处理函数和中间件的处理函数都放在了Handlers的数组中 2.在调用Group的时候, 是将路由的path上面拼上Group的值. 也就是/user/:name, 会变成v1/user:name
调用group.engine.addRoute(httpMethod, absolutePath, handlers)将预处理阶段的结果注册到gin Engine的trees上
gin的路由树算法是一棵前缀树. 不过并不是只有一颗树, 而是每种方法(POST, GET ...)都有自己的一颗树
gin 路由最终的样子大概是下面的样子
其实gin的实现不像一个真正的树, children []*node所有的孩子都放在这个数组里面, 利用indices, priority变相实现一棵树
当服务端收到客户端的请求时, 根据path去trees匹配到相关的路由, 拿到相关的处理handlers
主要在下面这个函数里面调用程序注册的路由处理函数
参考链接