go语言服务器运行,Go语言实现Web服务器

使用Go语言的库非常容易实现一个Web服务器,用来响应像fetch那样的客户端请求。本节将展示一个迷你服务器,返回访问服务器的URL的路径部分。例如,如果请求的URL是http://localhost:8000/hello,响应将是URL.Path="/hello"。

//server1.go这是一个迷你回声服务器packagemainimport("fmt""log""net/http")funcmain(){http.HandleFunc("/",handler)//回声请求调用处理程序log.Fatal(http.ListenAndServe("localhost:8000",nil))}//处理程序回显请求URLr的路径部分funchandler(whttp.ResponseWriter,r*http.Request){fmt.Fprintf(w,"URL.Path=%qn",r.URL.Path)}

这个程序只有寥寥几行代码,因为库函数做了大部分工作。main函数将一个处理函数和以“/”开头的URL链接在一起,代表所有的URL使用这个函数处理,然后启动服务器监听进入8000端口处的请求。

一个请求由一个http.Request类型的结构体表示,它包含很多关联的域,其中一个是所请求的URL。当一个请求到达时,它被转交给处理函数,并从请求的URL中提取路径部分(/hello),使用fmt.Printf格式化,然后作为响应发送回去。

让我们在后台启动服务器。在MacOSX或者Linux上,在命令行后添加一个&符号;在微软Windows上,不需要&符号,而需要单独开启一个独立的命令行窗口。

$gorunsrc/gopl.io/chl/serverl/main.go&

可以从命令行发起客户请求:

$gobuildgopl.io/ch5/fetch

$./fetchhttp://localhost:8000

URL.Path=T

$./fetchhttp://localhost:8000/help

URL.Path="/help"

另外,还可以通过浏览器进行访问,如下图所示。

4-1ZQ515245I20.gif

图:来自回声服务器的响应

为服务器添加功能很容易。一个有用的扩展是一个特定的URL,它返回某种排序的状态。例如,这个版本的程序完成和回声服务器一样的事情,但同时返回请求的数量;URL/count请求返回到现在为止的个数,去掉/count请求本身:

//server2.go这是一个迷你的回声和计数器服务器packagemainimport("fmt""log""net/http""sync")varmusync.Mutexvarcountintfuncmain(){http.HandleFunc("/",handler)http.HandleFunc("/count",counter)log.Fatal(http.ListenAndServe("localhost:8000",nil))}//处理程序回显请求的URL的路径部分funchandler(whttp.ResponseWriter,r*http.Request){mu.Lock()count++mu.Unlock()fmt.Fprintf(w,"URL.Path=%qn",r.URL.Path)}//counter回显目前为止调用的次数funccounter(whttp.ResponseWriter,r*http.Request){mu.Lock()fmt.Fprintf(w,"Count%dn",count)mu.Unlock()}

这个服务器有两个处理函数,通过请求的URL来决定哪一个被调用:请求/count调用counter,其他的调用handler。以“/”结尾的处理模式匹配所有含有这个前缀的URL。在后台,对于每个传入的请求,服务器在不同的goroutine中运行该处理函数,这样它可以同时处理多个请求。

然而,如果两个并发的请求试图同时更新计数值count,它可能会不一致地增加,程序会产生一个严重的竞态bug。为避免该问题,必须确保最多只有一个goroutine在同一时间访问变量,这正是mu.Lock()和mu.Unlock()语句的作用。

作为一个更完整的例子,处理函数可以报告它接收到的消息头和表单数据,这样可以方便服务器审查和调试请求:

//处理程序回显HTTP请求funchandler(whttp.ResponseWriter,r*http.Request){fmt.Fprintf(w,"%s%s%sn",r.Method,r.URL,r.Proto)fork,v:=ranger.Header{fmt.Fprintf(w,"Header[%q]=%qn",k,v)}fmt.Fprintf(w,"Host=%qn",r.Host)fmt.Fprintf(w,"RemoteAddr=%qn",r.RemoteAddr)iferr:=r.ParseForm();err!=nil{log.Print(err)}fork,v:=ranger.Form{fmt.Fprintf(w,"Form[%q]=%qn",k,v)}}

这里使用http.Request结构体的成员来产生类似下面的输出:

GET/?q=queryHTTP/1.1

Header["Accept-Encoding"]=["gzip,deflate,sdch"]

Header["Accept-Language"]=["en-US,en;q=0.8"]

Header["Connection"]=["keep-alive"]

Header["Accept"]=["text/html,application/xhtml+xml,application/xml;…"]

Header["User-Agent"]=["Mozilla/5.0(Macintosh;IntelMacOSX10_7_5)…"]

Host="localhost:8000"

RemoteAddr="127.0.0.1:59911"

Form["q"]=["query"]

注意这里是如何在if语句中嵌套调用ParseForm的。Go允许一个简单的语句(如一个局部变量声明)跟在if条件的前面,这在错误处理的时候特别有用。也可以这样写:

err:=r.ParseForm()

iferr!=nil{

log.Print(err)

}

这些程序中,我们看到了作为输出流的三种非常不同的类型。fetch程序复制HTTP响应到文件os.Stdout,像lissajous一样;fetchall程序通过将响应复制到ioutil.Discard中进行丢弃(在统计其长度时);Web服务器使fmt.Fprintf通过写入http.Responsewriter来让浏览器显示。

尽管三种类型细节不同,但都满足一个通用的接口(interface),该接口允许它们按需使用任何一种输出流。该接口称为io.Writer。

我们来看一下整合Web服务器和lissajous函数是一件多么容易的事情,这样GIF动画将不再输出到标准输出而是HTTP客户端。简单添加这些行到Web服务器:

handler:=func(whttp.ResponseWriter,r*http.Request){

lissajous(w)

}

http.HandleFunc("/",handler)

或者也可以:

http.HandleFunc("/",func(whttp.ResponseWriter,r*http.Request){

lissajous(w)

})

上面HandleFunc函数中立即调用的第二个参数是函数字面量,这是一个在该场景中使用它时才定义的匿名函数。

一旦完成这个改变,就可以通过浏览器访问http://localhost:8000。每次加载页面,将看到一个类似下图的动画。

4-1ZQ515252N42.gif

图:浏览器中的动态利萨茹图形

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/345790.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【渝粤题库】国家开放大学2021春1001中国法制史题目

教育 教育 试卷代号: 1001 2021年春季学期期末统一考试 中国法制史 试题 2021年7月 一、单项选择题(每小题2分,共20分) 1.商朝法律制度的总称叫做( )。 A.禹刑 B.汤刑 C.汤诰 D.九刑 2.战国时期改“法”为“律”的人是( )。 A.韩…

【渝粤题库】国家开放大学2021春1009离散数学(本)题目

教育 教育 试卷代号:1009 2021年春季学期期末统一考试 离散数学(本) 试题 2021年7月 一、单项选择题(每小题4分,本题共20分) 1.若集合A{1,2,3,4},则下列表述…

矩阵向量求导

本系列主要参考文献为维基百科的Matrix Caculas和张贤达的《矩阵分析与应用》。 一、求导定义与求导布局 1. 矩阵向量求导引入 2. 矩阵向量求导定义 3. 矩阵向量求导布局 具体总结如下: 4. 矩阵向量求导基础总结 有了矩阵向量求导的定义和默认布局,…

多媒体计算机属于哪种教学,多媒体计算机属于哪种教学媒体(???)。

摘要:高处触电发生,多媒行抢护理救与应就地进,及时抢救为使。算机属于我国率为电网的额定频。教学火电一般量表流量厂中采用差压测量式流。...高处触电发生,多媒行抢护理救与应就地进,及时抢救为使。械的固定在擦近转部…

【渝粤题库】国家开放大学2021春1020国际私法题目

教育 教育 试卷代号: 1020 2021年春季学期期末统一考试 国际私法 试题 2021年7月 一、单项选择题(每题2分,共20分,每题只有一项答案正确,请将正确答案的序号填在括号内) 1.下列哪个选项不属于国际私法的渊…

导数的四则运算和复合函数的求导

1. 常用初等函数的求导公式 2. 函数的四则运算求导简单可记为 3. 反函数求导法则 https://www.sohu.com/a/233597731_507476

【渝粤题库】国家开放大学2021春1026西方经济学(本)题目

教育 教育 试卷代号: 1026 2021年春季学期期末统一考试 西方经济学(本) 试题 2021年7月 一、单项选择题(在下列各题的备选答案中选择一个正确的,并将其序号字母填入题后的括号里。每题2分,共30分&#xf…

rest spring_Spring REST:异常处理卷。 1个

rest spring目录 Spring REST:异常处理卷。 1个 Spring REST:异常处理卷。 2 Spring REST:异常处理卷。 3 大家好,是时候继续在我的博客中发布新文章了。 因此,我很高兴地宣布,我计划撰写一些技术性的系…

英特尔服务器主板型号参数对照表,Intel主板芯片组参数速查表(201805版)

2018年5月6日更新注:以上主板频率是intel的规范,而实际工厂在制造的时候,可以让主板支持到更高的频率,这称为内存频率的OC支持。2016年底,intel200系列芯片组发布了,主要有:Z270、H270、B250三款…

【渝粤题库】国家开放大学2021春1044合同法题目

教育 教育 试卷代号: 1044 2021年春季学期期末统一考试 合同法 试题 2021年7月 注意事项 一、将你的学号、姓名及分校(工作站)名称填写在答题纸的规定栏内。考试结束后,把试卷和答题纸放在桌上。试卷和答题纸均不得带出考场。监…

AWS共享资源的警告

最近,我一直在发布一个新版本,与往常一样,通过将DNS记录切换为指向以前的“备用”组的负载平衡器来利用蓝绿色部署 。 但是在切换DNS之前,我检查了新启动版本的日志并发现了一些奇怪的现象– Web框架(Spring MVC&#…

【渝粤题库】国家开放大学2021春1069中央银行理论与实务答案

教育 教育 试卷代号:1069 2021年春季学期期末统一考试 中央银行理论与实务 试题答案及评分标准 (供参考) 2021年7月 一、单项选择题(在下列各题的备选答案中选择一个正确的,并将其序号字母填入题中的括号里。每小题3…

schur补(schur complement)

1. schur补的定义及性质 2. schur补的应用 2.1 在矩阵方程求解中的应用 2. 概率论和统计学中的应用 https://blog.csdn.net/itnerd/article/details/83385817

oppo r17听筒测试软件,【OPPOR17评测】ColorOS变智能 OPPO R17堪称生活小秘书(全文)_OPPO R17(6GB RAM/全网通)_手机评测-中关村在线...

近两年来,手机的全面屏设计不是美人尖就是刘海屏,这两种设计虽然可以扩大屏占比,但是缺少设计的美感。这时候,OPPO R17终于为我们带来了即有较高的屏占比又优雅的全面屏设计——水滴屏,让摄像头向水滴一样“垂涎欲滴”…

【渝粤题库】国家开放大学2021春1078复变函数题目

教育 教育 试卷代号:1078 2021年春季学期期末统一考试 复变函数 试题 2021年7月 一、单项选择题(本题共20分,每小题4分) 1.若zxiy,则|z|2( ). A.x2-y2 B.y2-x2 C.zz D.x2y2 2.函数f(z) |z|2在( ). A.复平面解析 B.上…

【渝粤题库】国家开放大学2021春1089现代教育思想题目

教育 教育 试卷代号: 1089 2021年春季学期期末统一考试 现代教育思想 试题(开卷) 2021年7月 注意事项 一、将你的学号、姓名及分校(工作站)名称填写在答题纸的规定栏内。考试结束后,把试卷和答题纸放在桌…

图之DFS与BFS的复杂度分析

1. BFS的复杂度分析 vvv为图的顶点数,EEE为边数。 BFS是一种借用队列来存储的过程,分层查找,优先考虑距离出发点近的点。无论是在邻接表还是邻接矩阵中存储,都需要借助一个辅助队列,vvv个顶点均需入队,最坏…

计算机模拟定点突变,分子模拟对接和定点突变提高10β–去乙酰巴卡亭-华南农业大学学报.PDF...

分子模拟对接和定点突变提高10β–去乙酰巴卡亭-华南农业大学学报华南农业大学学报 2018, 39(5): 87-92Journal of South China Agricultural University doi: 10.7671/j.issn.1001-411X.2018.05.013欧阳萍兰, 黄佳俊, 林淑玲, 等. 分子模拟对接和定点突变提高10β–去乙酰巴卡…

【渝粤题库】国家开放大学2021春1121健康教育与健康促进题目

教育 教育 试卷代号: 1121 2021年春季学期期末统一考试 健康教育与健康促进 试题 2021年7月 一、单项选择题(每题2分,共40分) 1.高血压病的家族聚集现象体现了影响健康的( )。 A.生物学因素 B.环境因素 C.生态学因素 D.卫生保健…

【渝粤题库】国家开放大学2021春1018国际公法题目

教育 教育 试卷代号: 1018 2021年春季学期期末统一考试 国际公法 试题 2021年7月 一、单项选择题(每题1分,共10分,每题只有一项答案正确,请将正确答案的序号填在括号内) 1.关于国际法的效力依据问题&…