Go 实现 Web 框架 Day3 学习笔记
极客兔兔大佬的《七天用Go从零实现系列》Day3 前缀树路由学习笔记
Day3 内容
主要实现前缀路由匹配 (约150行代码)
- :name 格式的路径参数路由匹配
- *filepath 格式的文件路径路由匹配
##本节知识
- 前缀树( Trie 树) 结构实现动态的路由匹配
- 函数的递归调用
开发内容
具体内容: https://geektutu.com/post/gee-day3.html
开发需求:
增加 “:name” 和 “.filepath” 两种类型的动态匹配
操作步骤:
- 定义 trie 组件,专门用于路由匹配
- 定义 node 类型,每个 node 和路径中的一个访问层级( /…/ 中间的内容)
- 2个基本方法,insert 和 search 方法
- 3个扩展方法
parsePattern 解析请求路径成层级切片;
matchChild 获取第一个匹配成功的节点,用于插入;
matchChildren 所有匹配成功的节点,用于查找 - 修改 router.go 方法,调整 addRouter 的逻辑
- 新建测试用例,测试动态路由匹配
- 修改调用逻辑,加入2种动态匹配的 用例
思考题
- go 中字符串如何比较?
- 切片与数组的区别?
- 切片扩容过程?
最后答案单独列一篇,可以自己试着解答一下。
小结
Day3 主要增加了前缀树( Trie 树)路由,不再使用静态全文匹配路由。
数据结构从 map[string]HandlerFunc 过渡到 map[string]*node,算法从 hash 计算变成了 Trie 树。
Day2 中将整个框架分为 Context 组件和 Router 组件,定制路由匹配时,将修改的范围限定在了 Router 组件中,变化没有扩散。
我们还新增了 insert 和 search 两个方法,之前设计实现的时候没有考虑后续变化,要注意面向接口编程而不是面向具体实现编程,当然还要警惕过度设计的问题。