3.09 路由树-参数路径之基本注册和查找
本节课工程结构如下:
(base) yanglei@yuanhong 14-paramRoute % tree ./
./
├── context.go
├── handleFunc.go
├── httpServer.go
├── httpServer_test.go
├── node.go
├── router.go
├── router_test.go
└── serverInterface.go
0 directories, 8 filesPART1. 学习路线

PART2. 参数路径的定义与设计
2.1 参数路径的定义
参数路径:就是指在路径中带上参数,同时这些参数对应的值可以被业务取出来使用.在我们的设计中用:参数名的形式表示路由参数
例:/user/:id,如果输入路径/user/123,则会命中这个路由/user/:id,并且在业务函数中可以取到变量id = 123.
2.2 参数路径的设计
那么问题来了:
是否允许同样的参数路径和通配符匹配一起注册?
例如同时注册
/user/*和/user/:id
可以,但没必要,用户也不应该设计这种路由
PART3. 实现参数路由节点的创建
3.1 修改node的结构
node的结构和实现通配符路由注册的过程相同.由于参数路由节点的逻辑是需要特殊处理的(不管在注册路由还是查找路由时),因此需要为node结构体单独定义表示其参数路由子节点的成员属性.
node.go:
3.2 定义测试用例
此处还是在router_test.go中新建一个函数用于测试参数路由匹配:
router_test.go:
这个时候测试肯定是不通过的.我们断点调试看一下预期和现状的差异:


和实现通配符路由注册的过程相同,先调整创建节点的逻辑
3.3 修改创建子节点的逻辑
node.go:
3.4 修改判断子节点相等的逻辑
在比对完两个节点的子节点映射数量之后,还要比对两个节点的参数子节点是否相同.
router_test.go:
此时再运行测试用例,即可顺利通过
PART4. 实现参数路由节点的查找
4.1 修改childOf()方法
childOf()方法之前的childOf()方法是先在当前节点的子节点映射中查找子节点,若未找到则尝试返回当前节点的通配符子节点.
而我们需要的结果是:
先在当前节点的子节点映射中查找子节点
若未找到则尝试返回当前节点的参数路由子节点
若还未找到则尝试返回当前节点的通配符子节点
换言之,我们设计的路由优先级为:静态路由 > 参数路由 > 通配符路由
node.go:
实际上通配符路由不应该和参数路由共存,只是本节课还没实现这个逻辑.
4.2 编写测试用例
router_test.go:
单测顺利通过
Last updated