本文公众号文章链接:https://mp.weixin.qq.com/s/LLcPDPtpjNeXAA_ffL3YCg

本文csdn博客链接:http://blog.csdn.net/screscent/article/details/79642534

Gorilla是一个go语言的web工具箱,包含了很多的模块。本文分析的模块gorilla/mux: is a powerful URL routerand dispatcher.

源码目录:

一共有4部分,context,mux,regex,route。其中regex不讲解,对这部分感兴趣的可以自己去看。

一、  context

这部分代码比较简单,先将这部分代码讲解下。

Context源码分为两个模式,一个是gorilla自带的context,一个是系统自带的native。提供的接口都是一样的。

github.com/gorilla/mux/context_gorilla.go

源码为!go1.7版本的时候,会编译此版本

源码很简单,提供了三个函数,contextGet、contextSet、contextClear。

这三个函数都是对gorilla/context进行了一下封装而已。代码简单,从函数名就能够知道其含义,就不做过多讲解。

github.com/gorilla/mux/context_native.go

当为go1.7版本的时候,会编译此版本。

同样的是三个函数,只是里面封装的是标准库。

二、  mux

mux是整个模块的入口。一般的用法如下

funcmain() {

r := mux.NewRouter()

r.HandleFunc("/", HomeHandler)

r.HandleFunc("/products", ProductsHandler)

r.HandleFunc("/articles", ArticlesHandler)

http.Handle("/", r)

}

那我们来看看源码

github.com/gorilla/mux/mux.go

NewRouter为创建Router实例。

这里面有两个框。

1、        routes:route得列表

2、        一些flag,如果仅仅只是想了解流程的话,这些flag可以忽略。

我们先看看这些flag是做什么用的。不关心的可以略过这部分。

strictSlash:直接翻译意思为严格的斜杠。

按照上面的英文注释,可以看到的是定义了一种对于斜杠的行为。

1、        true:当path为“/path/”时,访问“/path”的时候会被重定向到“/path/”。就是说程序的是路由中指定的路径

2、        false:当path为“/path”时,访问“/path/”的时候将不会被此路由匹配。

3、        特殊情况:当路由设置了PathPrefix方法时,此路由将忽略此flag。

SkipClean:直接翻译为跳过clean

按照注释,可以看到定义清洗path的行为

1、        true:当path为/path//to的时候,将会保留其中的多个斜杠

2、        false:当path为/fetch/http://xkcd.com/534 将会被清理掉,变成/fetch/http/xkcd.com/534

所以按照自己的需求来设置

UseEncodePath:直接翻译为使用编码路径

按照注释,看两个案例

1、        true:"/path/foo%2Fbar/to"will match the path "/path/{var}/to".

2、        False:"/path/foo%2Fbar/to"will match the path "/path/foo/bar/to"

案例来的最直接简单了。

好了介绍完了flag,那么我们直接进入到入口ServerHTTP

在红框中,为已经解释过的flag的处理。

再往下,则是寻找匹配的路由,然后进入对应匹配路由所对应的handler。

我们看看Match,是如何匹配的。

这里面很直接粗暴,就是直接遍历了routes,一个一个的去进行匹配,直到找到可以匹配上的。

根据这个逻辑提示,路径规则的顺序也很重要。

上面两个是最常规的两个构建接口

下面还提供了非常规的构建接口

有针对host的,matcherfunc,methods,

还有path,pathprefix,queries,schemes,buildvarsfunc等等构建接口

具体的,还得看下一个文件route

三、route

直接进入源码github.com/gorilla/mux/route.go

其中最重要的两个为handler、matchers。当然,还有一个regexp。

结构体里,还有一些flag。这个都是从router中传入进来。

我们从流程入手看看

从上面可以看到,buildonly模式的话,不做匹配,之做url生成用。

在route中,有注册很多matchers,会每个都进行匹配,只要有一个不能匹配则,此路由匹配为失败。

下面先看下简单的handler得赋值接口

将handler保存在变量route的handler中。

下面分析下,matchers。

Matcher的接口定义,然后就是addmatcher:就是讲matcher保存在router的matchers切片中。

还有一个addRegexmatcher,也是将regex处理下后进行添加

HeaderMatcher

HeaderRegexMatcher

hostMatcher

MatcherFunc

MethodMatcher

Path

pathPrefix

query

Schemes

Subrouter

自此,对于serverhttp的使用,基本就差不多了。

四、registered URLs模式

这种为register urls用法

那么我们看看源码

github.com/gorilla/mux/mux.go

在Router中有一个变量,专门用来为urlbuilding使用的。

继续跟踪看源码

返回的就是Router中的namedRoutes

那么我们看看源码

Route的parent就是Router。所以其实就是在Router中注册了自己

URL

URLHost

URLPath

龚浩华

月牙寂 道长

QQ 29185807

2018年03月21日

第一时间获取文章,可以关注本人公众号:月牙寂道长,也可以扫码关注

Gorilla源码分析之gorilla/mux源码分析相关推荐

  1. Gorilla源码分析之gorilla/context源码分析

    公众号文章链接:https://mp.weixin.qq.com/s/KogOt-hd6KvXljwYwK7aQg csdn博客链接:http://blog.csdn.net/screscent/ar ...

  2. 【Android 事件分发】ItemTouchHelper 源码分析 ( OnItemTouchListener 事件监听器源码分析 二 )

    Android 事件分发 系列文章目录 [Android 事件分发]事件分发源码分析 ( 驱动层通过中断传递事件 | WindowManagerService 向 View 层传递事件 ) [Andr ...

  3. 【Android 事件分发】ItemTouchHelper 源码分析 ( OnItemTouchListener 事件监听器源码分析 )

    Android 事件分发 系列文章目录 [Android 事件分发]事件分发源码分析 ( 驱动层通过中断传递事件 | WindowManagerService 向 View 层传递事件 ) [Andr ...

  4. 【OkHttp】OkHttp 源码分析 ( OkHttpClient.Builder 构造器源码分析 )

    OkHttp 系列文章目录 [OkHttp]OkHttp 简介 ( OkHttp 框架特性 | Http 版本简介 ) [OkHttp]Android 项目导入 OkHttp ( 配置依赖 | 配置 ...

  5. HBase源码分析之HRegion上compact流程分析(三)

    在<HBase源码分析之HRegion上compact流程分析(二)>一文中,我们没有讲解真正执行合并的CompactionContext的compact()方法.现在我们来分析下它的具体 ...

  6. Flume 1.7 源码分析(一)源码编译

    Flume 1.7 源码分析(一)源码编译 Flume 1.7 源码分析(二)整体架构 Flume 1.7 源码分析(三)程序入口 1 说明 Flume是Cloudera提供的一个高可用的,高可靠的, ...

  7. Storm源码分析之四: Trident源码分析

    Storm源码分析之四: Trident源码分析 @(STORM)[storm] Storm源码分析之四 Trident源码分析 一概述 0小结 1简介 2关键类 1Spout的创建 2spout的消 ...

  8. 深入java并发包源码(三)AQS独占方法源码分析

    深入java并发包源码(一)简介 深入java并发包源码(二)AQS的介绍与使用 深入java并发包源码(三)AQS独占方法源码分析 AQS 的实现原理 学完用 AQS 自定义一个锁以后,我们可以来看 ...

  9. 友盟统计java代码_SFAnalytics 分析友盟统计源码,反编译 SDK,还有部分没有 出来 android 259万源代码下载- www.pudn.com...

    文件名称: SFAnalytics下载  收藏√  [ 5  4  3  2  1 ] 开发工具: Java 文件大小: 8023 KB 上传时间: 2016-06-05 下载次数: 0 提 供 者: ...

最新文章

  1. android百度网盘倍速,百度网盘在线倍数播放-全网最强,已做群组视频适配,不用保存文件也可倍速,无vip限制(附加安卓倍速版)...
  2. 优化SQL查询:如何写出高性能SQL语句
  3. 熊猫数据集_熊猫迈向数据科学的第一步
  4. 基于matlab的数字下变频器的设计与仿真应用,基于MATLAB的数字下变频器的设计与仿真应用.pdf...
  5. Android之圆角矩形
  6. 操作系统之I/O管理:1、I/O控制器、I/O控制方式(程序直接控制方式、中断驱动方式、DMA方式、通道控制方式)
  7. linux 安装nvm ,管理多版本nodejs
  8. Activity实现 高亮显示活动节点,和所有已完成过的节点
  9. 计算机毕业设计中基于python的快递查询系统
  10. 华数java 知乎_纠结编程语言的选择?他们为什么都选择了Java?
  11. C语言解释器的实现--让脚本跑起来(六)
  12. 计算机数字音频制作工具
  13. tolist()的作用
  14. python bt_linux平台使用Python制作BT种子并获取BT种子信息的方法
  15. 树莓派怎么切换输入法_为树莓派安装Fcitx和谷歌拼音中文输入法
  16. .axf文件_Keil开发环境如何生成BIN文件
  17. 以太坊数据结构MPT 1
  18. 如何提高自己的学习能力、效率
  19. 听君一席话,胜读十年书
  20. oracle 表收缩,Oracle在线收缩表——shrink space

热门文章

  1. Linux内核学习--ARM系列处理器(指令集等)性能全面分析
  2. 中国移动宽带测试用哪个软件,中国移动评测四大类手机应用APP 看完你就知道5G和4G网络差距在哪儿...
  3. python conda无法安装包 报错An HTTP error occurred when trying to retrieve this URL.
  4. 淘宝小程序(商家应用)开发提前需要了解的一些概念
  5. 外贸网站推广和分析!
  6. 编写跨平台Java程序注意事项
  7. vars()函数用法
  8. 纳米光触媒车用空气净化器给你驾车好心情!
  9. 淘宝会不会毁了携程?
  10. Python 解密 pdf 文件