路由功能是 web 框架中一个很重要的功能,它将不同的请求转发给不同的函数(handler)处理,很容易能想到,我们可以用一个字典保存它们之间的对应关系,字典的 key 存放 path,value 存放 handler。当一个请求过来后,使用routers.get(path, None) 就可以找到对应的 handler。
利用字典实现路由可以参考我的这篇文章:动手实现 web 框架[1] 。
使用字典有一个问题,不支持动态路由。如果路由像这样呢?
/hello/:name/profile
name 前面是通配符: ,表示这是个动态的值。一个解决办法是使用前缀树 trie。
前缀树
leetcode 中有这个算法,点这里[2] 查看。
前缀树前缀树,首先是一棵树。不同的是树中一个节点的所有子孙都有相同的前缀。前缀树将单词中的每个字母依次插入树中,插入前首先确认该单词是否存在,不存在才创建新节点,如果一个单词已经全部插入,则将末尾单词设置为标志位。
type Node struct { isWord bool // 是否是单词结尾 next map[string]*Node // 子节点}type Trie struct { root *Node}
以单词 leetcode,leetd 和 code 为例,