据说Go语言设计出来就是为了解决web软件的并发等诸多问题的,所以Go语言又被称为互联网中的c语言。一般的web应用采用的是"请求-响应"模式。在Go web中数据请求与数据返回相当于是基于"请求-响应"模式的web程序的输入输出。而其中数据在不同地方或者叫层次上有不同的表现形式,在客户端上数据一般采用字符串形式体现,而在后台数据一般体现为结构体或对象,这中间的转换需要相应的工具。用servlet/jsp直接开发过Java web程序的同学应该知道,在整个架构中必不可少的元素有web容器,web.xml.web容器必不可少大家应该无异议,但web.xml为什么说也必不可少呢?在web程序中一般采用的MVC三层,当在V层(视图层)向服务器端发送请求时,程序会到web.xml进行URL mapping,寻找相应的处理请求程序进行业务逻辑处理。在Java web中我们耳熟能详的三大框架struts2,spring,hibernate都只不过在不同的层次对servlet进行扩展而已.都离不开URL mapping,其实在Go web也是有这部分的,只不过换了一个不同的名字而已,叫路由。什么是路由呢?从百度百科中可以得到路由的说明:路由(routing)是指分组从源到目的地时,决定端到端路径的网络范围的进程。其实它的作用就是路径选择。在上次文章中说过,在servlet/jsp中是在web.xml里实现URLmapping的,而使用了struts时,就将实现URLmapping这部分工作放在了struts中的配置文件里。Go web中的路由就路由选择这一功能上其实和URLmapping(URL映射)是相同的,但接触过或熟悉Go web开发的人肯定知道,Go web中的路由是特别的灵活。许多Go web中间件和框架都是对Go web路由进行封装的,将路由匹配这一工作从main中剥离出去成为单独一层。有人肯定有疑惑,为何要如此大费周章呢?其实这样做一可以减轻main的压力,二是让路由选择变得更加通用性;三是路由选择这部分代码实现其实有很多重复工作,这样剥离出去可以减少代码的重复。中间件Negroni就是这样实现的。上面讲了这么多,那在Go web中到底什么是路由,路由又是如何实现路由选择的呢?

在go语言的http package里定义了路由的结构和相应的路由的函数:

type ServeMux struct {//定义路由规则mu    sync.RWMutex//锁机制,因为并发处理需要一个锁m     map[string]muxEntry//路由,采用map结构hosts bool // whether any patterns contain hostnames}
type muxEntry struct {//路由explicit bool   //是否精准匹配h        Handler//路由匹配后,所选择的处理pattern  string //匹配字符串}
基于路由的函数:
//match根据传递的path进行路由匹配,返回对应的Handlerfunc (mux *ServeMux) match(path string) (h Handler, pattern string)//根据给定request中是否连接网络这个状态进行判断并返回对应的路由//若request的Method 等于"CONNECT"则调用handler(host, path string)函数进行路由匹配func (mux *ServeMux) Handler(r *Request) (h Handler, pattern string)//handler(host, path string) 函数调用match(path string)进行路由匹配并返回对应的路由func (mux *ServeMux) handler(host, path string) (h Handler, pattern string)//ServeHttp实现了Handler接口,故它实际上也是一个Handler,内部调用handlerfunc (mux *ServeMux) ServeHTTP(w ResponseWriter, r *Request)//注册handlerfunc (mux *ServeMux) Handle(pattern string, handler Handler)//注册handler函数(它是直接使用func来注册的)func (mux *ServeMux) HandleFunc(pattern string, handler func(ResponseWriter, *Request))

Go web之旅(路由篇)相关推荐

  1. ESP8266开发之旅 网络篇⑭ web配网

    文章目录 1. 前言 2. Web配网(AP配网) 2.1 自定义AP配网 2.2 WiFiManager 3. 总结 授人以鱼不如授人以渔,目的不是为了教会你具体项目开发,而是学会学习的能力.希望大 ...

  2. angular路由传递参数_@medux 路由篇

    欢迎您开始@medux 之旅,建议您依次阅读以下 4 篇文章,这将耗费您大约 30 分钟. 为什么你需要 @medux @medux 基础概念速览 @medux 路由篇 @medux 数据流 第 3 ...

  3. php为什么需要配置路由器,laravel 配置路由 api和web定义的路由的区别详解

    1.路由经过中间件方面不同 打开kerenl.php就可以看到区别 protected $middlewareGroups = [ 'web' => [ \App\Http\Middleware ...

  4. Ctfshow web入门 PHP特性篇 web89-web151 全

    web入门 PHP特性篇的wp都一把梭哈在这里啦~ 有点多,师傅们可以收藏下来慢慢看,写的应该挺全面的叭- 有错误敬请斧正! CTFshow PHP web89 看题目,有个flag.php文件.题目 ...

  5. 基于koajs的web项目构建-心得篇

    2019独角兽企业重金招聘Python工程师标准>>> 根据 基于koajs的web项目构建-入门篇 所描述的,建立了项目的基本目录结构,接下来的工作便是编码,编译,测试,发布.做为 ...

  6. React Native填坑之旅--动画篇

    React Native填坑之旅--Button篇 React Native填坑之旅--动画 React Native填坑之旅--HTTP请求篇 动画是提高用户体验不可缺少的一个元素.恰如其分的动画可 ...

  7. ASP.NET MVC学习之路由篇(2)

    ASP.NET MVC学习之路由篇(2) 原文:ASP.NET MVC学习之路由篇(2) 继ASP.NET MVC学习之路由篇(1)后继续学习. 7.解决与物理路径的冲突 当发送一个请求至ASP.NE ...

  8. 高性能WEB开发 - HTTP服务器篇

    高性能WEB开发 - HTTP服务器篇 新产品为了效果,做的比较炫,用了很多的图片和JS,所以前端的性能是很大的问题,分篇记录前端性能优化的一些小经验. 第一篇:HTTP服务器 因tomcat处理静态 ...

  9. web性能测试分析-工具篇 (转载)

    web性能测试分析-工具篇 用于Web性能分析的工具还有很多,以下只不过是我所略知的几种,如各位有使用未列出性能工具,请跟帖共享.以下软件都可容易下载到.我建议全部下载,根据自已的需求,选择最适合自己 ...

最新文章

  1. MySQL更新命令_UPDATE
  2. MFC中OnInitDialog自动生成
  3. 使用jquery处理数据时要注意的问题
  4. 160个Crackme008
  5. 一个感染型木马病毒分析(二)
  6. 【软件开发】制作个人移动式Git服务器
  7. java mysql order by,java-使用LIMIT和MySQL进行ORDER BY
  8. jvm详解 - 新生代与老年代
  9. 下载输入python之小说下载器version2.0
  10. Eclipse或SVN—如何在Eclipse中安装SVN客户端插件
  11. router单页面多个标签tags的用法router-view/router-view
  12. Ynote源码涉及功能解剖
  13. Ubuntu 10.04 使用libfetion
  14. 证件照(1寸2寸)拍摄处理知识汇总
  15. Linkerd、Consul、Istio、Kuma、Traefik、AWS App服务网格全方位对比
  16. java vad_(转载)静音检测VAD算法
  17. wps自动插入文献_WPS中怎样自动生成参考文献?方法超级简单!
  18. 语c和c语言,00后黑话等级测试,你能看懂几句?
  19. vba中取小数点后两位数_如何在Excel中提取小数点后面的数字?
  20. DEM影像下载、拼接、裁剪(ArcGIS)

热门文章

  1. Oracle Ora 错误解决方案合集
  2. 使用字符串定界符(标准C ++)在C ++中解析(拆分)字符串
  3. 函数声明末尾的“ const”是什么意思? [重复]
  4. 当postgres的主键序列不同步时,如何重置?
  5. 如何在Java中解析命令行参数?
  6. 在Django中,“子弹”是什么?
  7. 什么时候应该在C ++中使用类与结构?
  8. jquery焦点事件
  9. 解决Ubuntu的错误提示
  10. 区块链:这项颠覆性技术将如何改变未来