golang 匹配 url_golang web开发——参数绑定(中)之Trie支持通配符匹配

本文介绍了如何在Golang中使用Trie数据结构修改以支持URL通配符匹配。通过增加节点属性和调整add方法,实现了简单的RESTful风格参数绑定。虽然存在逻辑缺陷,但足以理解后台实现原理。
摘要由CSDN通过智能技术生成

背景

上一篇文章,我们使用golang实现了一个简单但又实用的数据结构Trie,在日常工作中,我们也会有很多机会用到这样的数据结构,但是为了完成我们之前说的URI通配符匹配的问题,我们还需要稍微修改一下代码,这样才能达到我们的目的

修改

1.数据结构定义的修改

之前的节点如果要说匹配规则的话,可以说是"equals"匹配,都是默认属性,现在需要修改成通配符匹配,所以我们需要给Node增加一个属性,其次如果我们在search的时候,如果通配符匹配的情况下,需要把通配符对应的值需要记录下来,说大白话就是这个意思,如果我们事前定义"/user/group/:id"的url加入到我们trie之后,当实际的url"/user/group/12"来匹配的时候,我们不但要找到对应的Node节点,还需要进行赋值,也就是id=12,所以在这个基础上,我们新增如下2个属性

3feb9246be74e1be2ae1069b5498c0a2.png

2.add方法的修改

2.1在之前的add方法上,我们需要对切割好的["user","group",":id"]进行简单的判断,需要判断某个子path是否是通配符,例如":id"就是通配符,判断逻辑写的也比较简单,是否以":"开头

88b2755effc766c8eab3664d3c8d25f8.png

2.2 如果是通配符的走单独的add逻辑,请注意,我这边偷懒处理,我这边先默认"/user/:id/group"和"/user/:name/group"属于一类,虽然从逻辑上说是错误的,但因为写的是示例项目,不想搞得过于复杂,如果想看完整的实现可以参考httprouter的代码,本小节只是想帮助大家快速了解http基本的路由实现后台实现,简单的代码如下实现,跟普通的add没什么大区别,只是在第一次新增的时候,需要把wildcard设置成true

6980625d5e5c5e6e4bd329a2dd094ba2.png

getChildWildcard如下

800f90ce6ccce7cfd68aa5481b1f8cfe.png

2.3 search的代码改造如下

在上一篇的代码基础上,当找不到节点的时候,不能就简单的说无法匹配,还需要进一步判断通配符是否匹配,代码如下

5441a0a082854d54ac621168894e8700.png

到此为止,我们简单的一个支持查询URI restful风格的参数绑定的准备工作已经完成了,还算比较简单,虽然这么实现有很多逻辑上的缺陷,但这个并不妨碍我们理解golang如果需要支持强大的参数绑定,后台实现的原理

完整的代码github不能贴出来了,有推销的嫌疑,之前发过,或者有需要的同学私信我吧

小结

其实这一个小节非常简单就是在之前实现的逻辑基础上又进行了一次简单的加工,支持通配符匹配,实现的逻辑其实跟普通的节点新增是一样的,你可以把通配符看成一种特殊的节点,他的"equals"更加强大而已

(从文章阅读量来说,貌似大家还是喜欢先从golang的demo说起,并不喜欢我岔开,讲一些基础类的,等下篇结束之后,还是回到实战和demo模块吧),最后还是感谢大家的耐心阅读,有什么不对的欢迎拍砖指正,或者私信加好友,一起学习,方便的话点个关注,谢谢~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值