gorilla/mux类库解析

golang自带的http.SeverMux路由实现简单,本质是一个map[string]Handler,是请求路径与该路径对应的处理函数的映射关系。实现简单功能也比较单一: 1. 不支持正则路由, 这个是比较致命的 2. 只支持路径匹配,不支持按照Method,header,host等信息匹配,所以也就没法实现RESTful架构 而gorilla/mux是一个强大的路由,小巧但是稳定高效,不仅可以支持正则路由还可以按照Method,header,host等信息匹配,可以从我们设定的路由表达式中提取出参数方便上层应用,而且完全兼容http.ServerMux

使用事例

源码实现

Router的实现 路由信息是存放在一个Route类型的数组([]Route)中,数组中的每一个Route对象都表示一条路由信息,其中包含匹配该路由应该满足的所有条件及对应的上层处理Hanlder。当请求到来是Router会遍历Route数组,找到第一个匹配的路由则执行对应的处理函数,如果找不到则执行NotFoundHandler。

Route的实现 Route的实现其实也比较简单,正则表达式的解析不太好理解,subrouter的实现更是需要好好研究代码,但是这些对理解Route的设计思路实现影响不大。每一个Route中包含一个matcher数组,是所有限定条件的集合,matcher是一个返回bool值的接口。 当我们添加路由限定条件时,就是往matcher数组中增加一个限定函数。 当请求到来时,Route.Match()会遍历matcher数组,只有数组中所有的元素都返回true时则说明此请求满足该路由的限定条件。 假设我们规定只能以GET方式访问/user/{userid:[0-9]+}并且header中必须包含“Refer”:”example.com”,才能得到我们想要的结果我们可以这样设置路由

然后我们来看下Route是如何保存这三个限定条件的

context上下文

上面三个限定条件是如何实现的已经分析完了,路径匹配的最终正则表达式是/user/([0-9]+),参数名”userid”保存在varsN数组中,当正则匹配时提取出正则表达式中的参数值,并与varsN数组中的参数名称做关联,建立一个map[string][string]{“userid”:”123456”}

因为gorilla/mux选择与http.ServerMux的接口保持一致,所以上层应用的处理函数也就变成了固定的 Hanlder

正则匹配解析出的参数Vars怎么传递给上层处理函数呢?gorilla/mux使用了一个第三方模块gorilla/context。当http请求到来时,mux.Router会选择合适的路由,并提取出一些参数信息,将这些参数信息与http.Request对象在gorilla/context中建立映射关系,上层处理函数根据http.Request对象到context中找到该http.Request所对应的参数信息。 context的实现如下

上层处理函数中调用mux.Vars(r)则可以取出该http.Request所关联的参数信息

转自:http://shanks.leanote.com/post/gorilla-mux%E7%B1%BB%E5%BA%93%E8%A7%A3%E6%9E%90

原文发布于微信公众号 - Golang语言社区(Golangweb)

原文发表时间:2016-06-07

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏沈唁志

浅谈PHP中的设计模式

19030
来自专栏技术博客

编写高质量代码改善C#程序的157个建议[用抛异常替代返回错误、不要在不恰当的场合下引发异常、重新引发异常时使用inner Exception]

  自从.NET出现后,关于CLR异常机制的讨论就几乎从未停止过。迄今为止,CLR异常机制让人关注最多的一点就是“效率”问题。其实,这里存在认识上的误区,因为正...

13220
来自专栏Python入门

这4个Python实战项目,让你瞬间读懂Python!

Python当下真的很火。Python实战项目,也一直尤为关注,接下来,和大家介绍下十个Python练手的实战项目

20640
来自专栏个人随笔

eclipse 设置文本模板中 insert variable... 函数 详解

设置文本模板简要图:     设置文本模板详细过程:http://www.cnblogs.com/lsy131479/p/8478711.html ? 此处引出...

29860
来自专栏北京马哥教育

原来 Python 还有这些实用的功能和特点!

在使用Python多年以后,我偶然发现了一些我们过去不知道的功能和特性。一些可以说是非常有用,但却没有充分利用。考虑到这一点,我编辑了一些你应该了解的Pytho...

13820
来自专栏Java帮帮-微信公众号-技术文章全总结

【大牛经验】关于堆和栈的那些事

问题描述 编程语言书籍中经常解释值类型被创建在栈上,引用类型被创建在堆上,但是并没有本质上解释这堆和栈是什么。我仅有高级语言编程经验,没有看过对此更清晰的解释。...

37590
来自专栏PHP在线

什么是堆和栈,它们在哪儿?

问题描述 编程语言书籍中经常解释值类型被创建在栈上,引用类型被创建在堆上,但是并没有本质上解释这堆和栈是什么。我仅有高级语言编程经验,没有看过对此更清晰的解释。...

39050
来自专栏丑胖侠

《Drools 7 规则引擎教程》番外篇-规则条件匹配机制

问题场景 QQ技术群(593177274)中有同学遇到这一个问题场景:在多条规则(比如3条)的when中使用了一个相同的静态方法,并在静态方法中打印相关的日志信...

27680
来自专栏杨建荣的学习笔记

从sysbench中学习Lua

我做事喜欢结果导向,喜欢快速迭代,能10分钟搞定,绝对不愿意花15分钟。但是技术行当,还是得耐得住寂寞,因为很多事情10分钟搞不定,可能100分钟,100...

33750
来自专栏java一日一条

Java 理论与实践: 正确使用 Volatile 变量

Java 语言中的 Volatile 变量可以被看作是一种 “程度较轻的 synchronized”;与 synchronized 块相比,volatile 变...

8120

扫码关注云+社区

领取腾讯云代金券