codegangsta/negroni包和gorilla/mux包的一点理解

Negroni是一个http.Handle,因为他实现了

func (n *Negroni) ServeHTTP(rw http.ResponseWriter, r *http.Request) {    n.middleware.ServeHTTP(NewResponseWriter(rw), r)
}

所以Negroni可以作为http.listenAndServe的一个入口。

func (n *Negroni) Run(addr ...string) {    l := log.New(os.Stdout, "[negroni] ", 0)
    finalAddr := detectAddress(addr...)
    l.Printf("listening on %s", finalAddr)
    l.Fatal(http.ListenAndServe(finalAddr, n))
}

程序会在适当时候调用Negroni.ServeHTTP。


所有中间件,包括路由,都是一个被包装起来的http.Handle。

中间件的构成为:

type middleware struct {    handler Handler
    next    *middleware
}

Negroni的构成为:

type Negroni struct {    middleware middleware
    handlers   []Handler
}

可以看到,Negroni中包含有一个“首中间件”,和所有与中间件相关的Handler。middleWare很像链表的一个节,Negroni保存着首链节,然后依次访问所有中间件,(即依次调用中间件的Handler)。

这些中间件的Handler各有不同。

如"路由中间件"本身包含有一个Map数据结构,保存着路径以及对应的处理函数。"路由中间件"的Handler就是遍历这个Map,找到合适的处理函数进行处理。而如Log中间件,Recovery中间件等,则是具有处理Log和恢复相关的功能。


注意,http.Handler和Negroni.Handler不一样。

//Negroni.Handler
type Handler interface {    ServeHTTP(rw http.ResponseWriter, r *http.Request, next http.HandlerFunc)
}
//http.Handler
type Handler interface {    ServeHTTP(ResponseWriter, *Request)
}

negroni包和mux包的一点理解相关推荐

  1. 【Golang源码分析】Go Web常用程序包gorilla/mux的使用与源码简析

    目录[阅读时间:约10分钟] 一.概述 二.对比: gorilla/mux与net/http DefaultServeMux 三.简单使用 四.源码简析 1.NewRouter函数 2.HandleF ...

  2. 你真的理解粘包与半包吗?3分钟搞懂它

    通俗的例子 这里先举个可能不太恰当,但是很容易理解的例子. 比如,平时我们要寄快递,如果东西太大的话,那么就需要拆成几个包裹来邮寄. 收件人仅收到个别包裹的时候,东西是不完整的,对应到网络传输中,这种 ...

  3. R语言使用gt包和gtExtras包优雅地、漂亮地显示表格数据:使用gt包可视化表格数据,使其易于阅读和理解、使用gtExtras包添加一个图,显示表中某一列中的数字

    R语言使用gt包和gtExtras包优雅地.漂亮地显示表格数据:使用gt包可视化表格数据,使其易于阅读和理解.使用gtExtras包添加一个图,显示表中某一列中的数字 目录

  4. R语言使用gt包和gtExtras包优雅地、漂亮地显示表格数据:使用gt包可视化表格数据,使其易于阅读和理解、使用gtExtras包添加一个图,显示表中某一列中的数字、并为类型数据添加图像符号标签

    R语言使用gt包和gtExtras包优雅地.漂亮地显示表格数据:使用gt包可视化表格数据,使其易于阅读和理解.使用gtExtras包添加一个图,显示表中某一列中的数字.并为类型数据添加图像符号标签 目 ...

  5. 解析ip数据包java_ip包,ip数据包,数据包或者包的理解

    首先看看以下这段话: 路由器把需到达的网络的网络号保存在路由表中,当一个IP数据报被路由器接收到时,路由器先从该IP数据报中取出目的站点的IP地址,根据IP地址计算出目的站点所在网络的网络号,然后用网 ...

  6. ZYNQ开发系列——hw_platform包和BSP包中的一些理解

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 ZYNQ开发系列--hw_platform包和BSP包中的一些理解 前言 hw_platform BSP包 前言 前面我们完成了PS输 ...

  7. java 解析ip数据包_ip包,ip数据包,数据包或者包的理解

    首先看看以下这段话: 路由器把需到达的网络的网络号保存在路由表中,当一个IP数据报被路由器接收到时,路由器先从该IP数据报中取出目的站点的IP地址,根据IP地址计算出目的站点所在网络的网络号,然后用网 ...

  8. IDEA中打jar包和war包以及jar包和war包的区别及理解

    首先我们先理解一下什么是jar包和war包! jar包:jar是类的归档文件! JAR(Java Archive,Java 归档文件)是与平台无关的文件格式,它允许将许多文件组合成一个压缩文件,为 J ...

  9. Java项目 常用包的命名及理解【dao包、domain包、service包、utils包、web包、impl包】

    JavaWeb 黑马旅游网 项目结构:       目录 1.dao包 2.domain包 3.service包 4.utils包 5.web包 6.impl包 1.dao包 Dao:数据库相关操作 ...

最新文章

  1. linux环境调用gsoap,Linux下gSOAP的使用 (c++)
  2. 三线表是什么?R语言使用table1包绘制(生成)三线表、使用单变量分列构建三线表、通过topclass参数自定义三线表表格的显示形式(显示为类似斑马线、并将所有列居中,包括包含行标签的第一列)
  3. log4j2的xml的配置样例
  4. php文章远程图片,php保存远程图片到本地 php正则匹配文章中的远程图片地址
  5. 关于JAVA编译时找不到自定义包的问题
  6. 华为ap配置_Win10频发蓝屏,深度Deepin系统,调试华为AC和AP
  7. 【郭林专刊】JSP中JSTL提供的函数标签EL表达式操作字符串的方法
  8. 每日程序C语言9-判断分数段
  9. linux python安装教程_Linux系统如何安装Python?新手教程
  10. 新客户上云 –虚拟机及相关服务常见问题集锦
  11. 计算机学院吉祥物意见征集,“我的学校我做主 ——吉祥物征集”启事
  12. [转]:理解 Linux 配置文件
  13. 第五话 Asp.Net MVC 3.0【MVC实战项目の一】
  14. system什么意思c语言,system是什么意思?
  15. 慧都科技邀您品鉴“2021重庆高效加工与智能化升级峰会”
  16. android设备刷机精灵,使用刷机精灵给安卓手机刷机教程
  17. 小强学渲染之OpenGL的GPU管线
  18. 3.100个渗透测试实战#3(Lampiao)
  19. 最值得收藏的电脑使用习惯, 让你使用电脑的效率轻松提升数倍(持续更新中)
  20. 电脑右键“打开方式”不见了怎样恢复

热门文章

  1. Hadoop的java程序报错Exception in thread main java.io.FileNotFoundException: File does not exis
  2. 中国(吉林)首批援萨摩亚医疗队凯旋
  3. 世界之最VS谁是世界上最无聊的人
  4. 如何打开SQL server的MDF/LDF文件并修改数据
  5. APK获取包名的办法
  6. CSGO控制台与常用指令
  7. 全国计算机考试能带手机吗,全国计算机等级考试注意事项
  8. matlab中ode45用法,ode45(ode45用法举例)
  9. autocad2022版安装提示提示“The feature you are trying to use is on a network resource ...”失败解决办法
  10. 挤掉“酸柠檬”,内容创作市场迎来质量革命