关闭

Go web之旅(路由篇)

标签: go语言webweb应用源码分析go源码
2089人阅读 评论(0) 收藏 举报
分类:
   据说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进行路由匹配,返回对应的Handler

func (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,内部调用handler

func (mux *ServeMux) ServeHTTP(w ResponseWriter, r *Request)

 //注册handler

func (mux *ServeMux) Handle(pattern string, handler Handler)

 //注册handler函数(它是直接使用func来注册的)

func (mux *ServeMux) HandleFunc(pattern string, handler func(ResponseWriter, *Request))
0
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

超全的Go Http路由框架性能比较

from:http://colobu.com/2016/03/23/Go-HTTP-request-router-and-web-framework-benchmark/ 超全的Go Http路...
  • Real_Myth
  • Real_Myth
  • 2017-07-26 18:56
  • 2400

go web开发之url路由设计

概述最近在搞自己的go web开发框架, 反正也没打算私藏, 所以现在先拿出url路由设计这块来写一篇博客. 做过web开发的都知道, 一个好的url路由可以让用户浏览器的地址栏总有规律可循, 可以让...
  • qibin0506
  • qibin0506
  • 2016-09-21 22:36
  • 6050

Go web之旅(Request分析)

在网站上进行的每一次交互,其实其内部所经历的过程可以简化为3步: 1.发送请求 2.服务器端进行处理 3.请求响应 为什么要提到上面的交互过程呢?因为最近有读者建议讲一下网站交互,所以现在我们...
  • zyb228107
  • zyb228107
  • 2015-08-24 20:20
  • 860

Go 之旅四: 方法与接口篇

发表一篇学习 A Tour of Go (中文参考 Go 之旅中文 ) 整理的笔记,介绍Go 语言方法,接口,类型的基本概念和使用。http://ironxu.com/711
  • sanxiaxugang
  • sanxiaxugang
  • 2017-02-24 12:59
  • 316

go example之旅(上)

Introduce这是来自于go by example的例子,花了几天的时间写完了这些例子,感觉对我的帮助很大,对于初学者来说,我的建议还是先找本go的书从头到尾看一下,然后再来看这些例子,每个例子都...
  • zhangyifei216
  • zhangyifei216
  • 2016-06-26 16:59
  • 637

go example之旅(下)

Introduce这是来自于go by example的例子,花了几天的时间写完了这些例子,感觉对我的帮助很大,对于初学者来说,我的建议还是先找本go的书从头到尾看一下,然后再来看这些例子,每个例子都...
  • zhangyifei216
  • zhangyifei216
  • 2016-07-16 17:27
  • 810

Go 之旅二: 流程控制语句

本文是学习 A Tour of Go (中文参考 Go 之旅中文 ) 整理的笔记。介绍流程控制语句 for, if, else, switch 和 defer 的基本概念和使用。
  • sanxiaxugang
  • sanxiaxugang
  • 2017-02-16 09:04
  • 218

我的Go语言学习之旅六:做一个WIN的简单弹窗

做为一个WIN的爱好者,不得不说,通常情况下在学习一门新语言之后我会很急于制作一个弹窗来测试一下这个语言在WIN的窗体效果,这里不多说,先上代码。package mainimport ("github...
  • w_yunlong
  • w_yunlong
  • 2015-12-29 11:57
  • 2218

Go 之旅三: 复杂类型

本文是学习 A Tour of Go (中文参考 Go 之旅中文 ) 整理的笔记,介绍Go 语言的指针,结构体,数组,切片,映射和闭包的基本概念和使用
  • sanxiaxugang
  • sanxiaxugang
  • 2017-02-21 08:54
  • 195

go example之旅(中)

Introduce这是来自于go by example的例子,花了几天的时间写完了这些例子,感觉对我的帮助很大,对于初学者来说,我的建议还是先找本go的书从头到尾看一下,然后再来看这些例子,每个例子都...
  • zhangyifei216
  • zhangyifei216
  • 2016-07-02 11:41
  • 588
    个人资料
    • 访问:34081次
    • 积分:837
    • 等级:
    • 排名:千里之外
    • 原创:52篇
    • 转载:0篇
    • 译文:0篇
    • 评论:3条
    最新评论