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 files

PART1. 学习路线

学习路线

PART2. 参数路径的定义与设计

2.1 参数路径的定义

参数路径:就是指在路径中带上参数,同时这些参数对应的值可以被业务取出来使用.在我们的设计中用:参数名的形式表示路由参数

例:/user/:id,如果输入路径/user/123,则会命中这个路由/user/:id,并且在业务函数中可以取到变量id = 123.

2.2 参数路径的设计

那么问题来了:

  • 是否允许同样的参数路径和通配符匹配一起注册?

    • 例如同时注册/user/*/user/:id

可以,但没必要,用户也不应该设计这种路由

PART3. 实现参数路由节点的创建

3.1 修改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()方法是先在当前节点的子节点映射中查找子节点,若未找到则尝试返回当前节点的通配符子节点.

而我们需要的结果是:

  • 先在当前节点的子节点映射中查找子节点

  • 若未找到则尝试返回当前节点的参数路由子节点

  • 若还未找到则尝试返回当前节点的通配符子节点

换言之,我们设计的路由优先级为:静态路由 > 参数路由 > 通配符路由

node.go:

实际上通配符路由不应该和参数路由共存,只是本节课还没实现这个逻辑.

4.2 编写测试用例

router_test.go:

单测顺利通过

Last updated