使用Go开发web服务器
Go(Golang.org)是在标准库中提供HTTP协议支持的系统语言,通过他可以快速简单的开发一个web服务器。同时,Go语言为开发者提供了很多便利。这本篇博客中我们将列出使用Go开发HTTP 服务器的方式,然后分析下这些不同的方法是如何工作,为什么工作的。
在开始之前,假设你已经知道Go的一些基本语法,明白HTTP的原理,知道什么是web服务器。然后我们就可以开始HTTP 服务器版本的著名的“Hello world”。
首先看到结果,然后再解释细节这种方法更好一点。创建一个叫http1.go
的文件。然后将下面的代码复制过去:
package main import (
"io"
"net/http"
) func hello(w http.ResponseWriter, r *http.Request) {
io.WriteString(w, "Hello world!")
} func main() {
http.HandleFunc("/", hello)
http.ListenAndServe(":8000", nil)
}
在终端执行go run http1.go
,然后再浏览器访问http://localhost:8000。你将会看到Hello world!
显示在屏幕上。
为什么会这样?在Go语言里所有的可运行的包都必须命名为main
。我们创建了main和hello两个函数。
在main函数中,我们从net/http
包中调用了一个http.HandleFucn
函数来注册一个处理函数,在本例中是hello函数。这个函数接受两个参数。第一个是一个字符串,这个将进行路由匹配,在本例中是根路由。第二个函数是一个func (ResponseWriter, Request)
的签名。正如你所见,我们的hello函数就是这样的签名。下一行中的http.ListenAndServe(":8000", nil)
,表示监听localhost的8000端口,暂时忽略掉nil。
在hello函数中我们有两个参数,一个是http.ResponseWriter
类型的。它类似响应流,实际上是一个接口类型。第二个是http.Request
类型,类似于HTTP 请求。我们不必使用所有的参数,就想再hello函数中一样。如果我们想返回“hello world”,那么我们只需要是用http.ResponseWriter,io.WriteString,是一个帮助函数,将会想输出流写入数据。
下面是一个稍微复杂的例子:
package main import (
"io"
"net/http"
) func hello(w http.ResponseWriter, r *http.Request) {
io.WriteString(w, "Hello world!")
} func main() {
mux := http.NewServeMux()
mux.HandleFunc("/", hello)
http.ListenAndServe(":8000", mux)
}
在上面这个例子中,我们不在在函数http.ListenAndServe
使用nil
了。它被*ServeMux
替代了。你可能会猜这个例子跟我上面的例子是样的。使用http注册hanlder 函数模式就是用的ServeMux。
下面是一个更复杂的例子:
import (
"io"
"net/http"
) func hello(w http.ResponseWriter, r *http.Request) {
io.WriteString(w, "Hello world!")
} var mux map[string]func(http.ResponseWriter, *http.Request) func main() {
server := http.Server{
Addr: ":8000",
Handler: &myHandler{},
} mux = make(map[string]func(http.ResponseWriter, *http.Request))
mux["/"] = hello server.ListenAndServe()
} type myHandler struct{} func (*myHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
if h, ok := mux[r.URL.String()]; ok {
h(w, r)
return
} io.WriteString(w, "My server: "+r.URL.String())
}
为了验证你的猜想,我们有做了相同的事情,就是再次在屏幕上输出Hello world。然而现在我们没有定义ServeMux,而是使用了http.Server。这样你就能知道为什么可以i是用net/http包运行了服务器了。
使用Go开发web服务器的更多相关文章
- vs2015 无法连接到已配置的开发web服务器
问题一:vs2015 无法连接到已配置的开发web服务器 最靠谱方法如下:(和防火墙开启无关联, 注册表增加什么键值无关联 , 缺失asp.net core.Dll文件无关联 ) 分析,因为前提是你的 ...
- VS提示无法连接到已配置的开发web服务器的解决方法
VS2013每次启动项目调试好好的,今天出现了提示“提示无法连接到已配置的开发web服务器“,使用环境是本地IISExpress,操作系统为windows10,之前也出现过就是重启电脑又好了,这次是刚 ...
- DELPHI XE5开发WEB服务器及安卓手机客户端
Xe5开发web服务端和手机客户端 ------------------------------------- Delphi xe5作为最新开发利器,就类似如当年的DELPHI,功能强大,快发速度快, ...
- 使用Gulp构建本地开发Web服务器
前端模拟ajax,就需要配置web服务器(apache,iis,nginx),有点麻烦 代码有一点点修改,就需要F5刷新页面很麻烦 Gulp + Gulp-connect + watch + live ...
- 无法连接到已配置的开发web服务器
http://jingyan.baidu.com/article/29697b91099847ab20de3c8b.html 这是防火墙造成的,将防火墙关闭即可
- vs2012无法启动已配置的开发Web服务器
] 有些教程说要开,我就没懂了
- python开发web服务器——搭建简易网站
参看:https://blog.csdn.net/baidu_35085676/article/details/69807145
- Node.js学习笔记——Node.js开发Web后台服务
一.简介 Node.js 是一个基于Google Chrome V8 引擎的 JavaScript 运行环境.Node.js 使用了一个事件驱动.非阻塞式 I/O 的模型,使其轻量又高效.Node.j ...
- JavaWeb基础: Web应用和Web服务器
Web Server工作原理 假设工程师想提供一个网页浏览的Web应用给客户,需要经过以下几步: 在指定目录下新建资源(hello.html) 编写一个服务器ServerDemo监听请求和响应请求:S ...
随机推荐
- Codeforce - Street Lamps
Bahosain is walking in a street of N blocks. Each block is either empty or has one lamp. If there is ...
- 10秒钟安装 Vim编辑器,5分钟浏览常用命令 2015.10.25
首先我想说,vim与vi的命令几乎相同,,所以学习编辑命令时很轻松,排除扩展相关,以及自动补全等配置的使用在外30秒钟安装 Vim编辑器,5分钟浏览常用命令环境:虚拟机Ubuntu:安装vim并浏览命 ...
- mysql的小总结
1.什么是数据库 ? 数据库(Database)是按照数据结构来组织.存储和管理数据的仓库,它产生于距今六十多年前,随着信息技术和市场的发展,特别是二十世纪九十年代以后,数据管理不再仅仅是存储和管理数 ...
- POJ 1564 经典dfs
1.POJ 1564 Sum It Up 2.总结: 题意:在n个数里输出所有相加为t的情况. #include<iostream> #include<cstring> #in ...
- Selenium_获取相对坐标
<html> <head> <title>位置</title> <style> .test { background: url(" ...
- 转载:C#中的Invoke理解一
在用.NET Framework框架的WinForm构建GUI程序界面时,如果要在控件的事件响应函数中改变控件的状态,例如:某个按钮上的文本原先叫“打开”,单击之后按钮上的文本显示“关闭”,初学者往往 ...
- validation插件
1.项目下载地址:http://plugins.jquery.com/validation/ 2.引入 <script type="text/javascript" src= ...
- css去掉使用bootstrap框架后打印网页时预览效果下的超链接
在我们写网页的时候,超链接是链接各个页面的桥梁,也是搜索引擎爬虫(spider)收录网站页面的关键,因此,在每个网页中会有许多的超链. 今天,一个同行妹妹在使用了bootstrap框架来搭建自己的网站 ...
- Jquery局部刷新小案列
/* 调用showTest()方法去后台拿到处理数据后返回到part.jsp页面,main.jsp再调用html()方法 和显示的结果集show()方法把part.jsp显示到当前的页面,实现局部页面 ...
- 几何不能具有Z值
ArcEngine 复制要素Geometry时,产生 几何不能具有Z值 的异常 解决方法:http://forums.esri.com/Thread.asp?c=159&f=1707& ...