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,一经查实,立即删除!

相关文章

矩阵向量求导

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

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

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

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

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

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三款…

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终于为我们带来了即有较高的屏占比又优雅的全面屏设计——水滴屏,让摄像头向水滴一样“垂涎欲滴”…

别克gl8服务器返回数据为空,老司机教学:别克GL8商务车总线控制系统故障解决...

别克GL8(参数|图片)商务车原自动变速箱出现严重故障更换自动变速箱后,不能启动车辆。检查原因,接通电源后档位灯不亮,发动机故障灯亮,防盗指示灯亮,不能启动车辆。用别克车型诊断仪TECH2检查,发现访问不了通过串行数据总线连接传输的各个模块。 检测故障与解决:1、CLASS-2串行数…

导数与函数极值

http://wuli.wiki//online/DerMax.html

驻点、极值点、拐点间的区别和联系

一、极值点与驻点的“纠缠” 我们可以从以下三点去理解它们的区别与联系: 二、拐点和另两者的“牵扯” https://zhuanlan.zhihu.com/p/95782395

御龙在天手游怎么不显示服务器了,御龙在天手游进不去怎么办 闪退原因及解决办法...

御龙在天手游进不去怎么办?闪退原因及解决办法。御龙在天手游今天迎来了安卓平台的不删档不限号测试(游戏出现打不开的问题,下面就让小编为大家介绍一下出现这类问题的原因及解决办法吧!1.服务器问题游戏早上10点左右公布了下载的地址&#x…

矩阵乘法和向量乘法

1. 矩阵乘法 2.向量乘法 https://zhuanlan.zhihu.com/p/79760117

怪物猎人服务器维护时间,怪物猎人云服务器

怪物猎人云服务器 内容精选换一换云耀云服务器适用于对CPU、内存、硬盘空间和带宽无特殊要求,服务一般只需要部署在一台或少量的服务器上,一次投入成本少,后期维护成本低的场景。例如网站开发,Web应用。推荐使用云耀云服务器&…

Vaadin Flow –奇妙的鹿

您可能知道,Vaadin是Java上最受欢迎的Web框架之一: https://zeroturnaround.com/rebellabs/java-web-frameworks-index-by-rebellabs/ https://javapipe.com/hosting/blog/best-java-web-frameworks/ 最近发布了该Web UI开发框架的新版本– Vaadin 10…

转置与变换(Transposes and Permutation)

1. 转置(Transposes) 2. Inner Product 3. 对称(symmetric) 4. RTRR^TRRTR 5. Permutation 6.PALU 7. Conclusion 总结一下就是转置和对称的相互关系,以及其一些特性,矩阵中元素的位置变换成为了本文重点。 https://face2ai.com/math-linear-algebra-c…

排名前20位的在线编程课程,可促进您的职业发展

您是否想知道用时间和金钱可以进行的最佳投资是什么? 知识 作为软件开发人员,您应该不断学习新技能。 这是发展您的职业并享受奖励(金钱,情感等)的最佳方法。 朝着这个方向前进,您应该阅读书籍&#xff…

线性代数

一、线性方程组 三、矩阵、向量中元素的符号 四、矩阵中行向量、列向量 五、行向量 列向量 (向量内积) 六、列向量 行向量(向量外积) 七、矩阵 列向量 (按行写矩阵) 八、矩阵 列向量 (按列写矩阵) 九、行向量 矩阵 (矩阵按列写) 十、行向量 矩阵 &…

矩阵导数

-************************************************** https://wenku.baidu.com/view/f7fa307a580216fc700afdb9.html#

HTTP缓存与Spring示例

缓存是HTTP协议的强大功能,但由于某些原因,它主要用于静态资源,例如图像,CSS样式表或JavaScript文件。 但是,HTTP缓存不仅限于应用程序的资产,您还可以将其用于动态计算的资源。 只需少量工作,…

三层网络结构理解

1. 三层网络结构(核心层 汇聚层 接入层) 三层网络结构是采用层次化架构的三层网络。三层网络架构采用层次化模型设计,即将复杂的网络设计分成几个层次,每个层次着重于某些特定的功能,这样就能够使一个复杂的大问题变成…