第一个go程序: HTTP 服务示例
目录
1、准备工作
2、编译 && 运行
3、简单原理说明
我们先来看下在 Go 中创建一个基于 HTTP 协议的 Web 服务是多么的简单。以开发 Web 服务为例,我们可以基于 Go 标准库提供的 net/http 包,轻松构建一个承载 Web 内容传输的 HTTP 服务。
我们来构建一个最简单的 HTTP 服务,这个服务的功能很简单,就是当收到一个 HTTP 请求后,给请求方返回包含“hello, world”数据的响应。
1、准备工作
按下面步骤建立一个 simple-http-server 目录,并创建一个名为 simple-http-server 的 Go Module,执行go mod tidy自动添加依赖。
$ mkdir simple-http-server
$ cd simple-http-server
$ go mod init simple-http-server
$ go mod tidy
因为没有使用到第三方库(只使用了 Go 标准库的 http 包),所以go.mod文件只有如下的内容,所以此时执不执行go mod tidy命令影响不大。
$ cat go.mod
module simple-http-servergo 1.17
用最简项目布局,也就是在 simple-http-server 目录下创建一个 main.go 源文件,代码如下:
package mainimport "net/http"func main() {http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request){w.Write([]byte("hello, world"))})http.ListenAndServe(":8080", nil)
}
此时目录simple-http-server结构如下:
$ tree
.
├── go.mod
└── main.go
2、编译 && 运行
编译:在simple-http-server 目录下执行如下命令编译:
go build
预期正常情况下会在根目录下生成simple-http-server二进制文件。
运行:
./simple-http-server
测试:
curl localhost:8080/
预期正常情况下会返回hello, world内容。
当然在测试场景下,我们也可以不用编译直接使用go run命令运行程序,如下:
go run main.go
3、简单原理说明
main.go这段代码里,你要注意两个重要的函数,一个是 ListenAndServe,另一个是 HandleFunc。
我们通过 http 包提供的 ListenAndServe 函数,建立起一个 HTTP 服务,这个服务监听本地的 8080 端口。客户端通过这个端口与服务建立连接,发送 HTTP 请求就可以得到相应的响应结果。
那么服务端是如何处理客户端发送的请求的呢?我们看上面代码中的第 6 行。在这一行中,我们为这个服务设置了一个处理函数。这个函数的函数原型是这样的:
func(w http.ResponseWriter, r *http.Request)
这个函数里有两个参数,w 和 r。第二个参数 r 代表来自客户端的 HTTP 请求,第一个参数 w 则是用来操作返回给客户端的应答的,基于 http 包实现的 HTTP 服务的处理函数都要符合这一原型。
你也发现了,在这个例子中,所有来自客户端的请求,无论请求的 URI 路径(RequestURI)是什么,请求都会被我们设置的处理函数处理。为什么会这样呢?这是因为,我们通过 http.HandleFunc 设置这个处理函数时,传入的模式字符串为“/”。HTTP 服务器在收到请求后,会将请求中的 URI 路径与设置的模式字符串进行最长前缀匹配,并执行匹配到的模式字符串所对应的处理函数。在这个例子中,我们仅设置了“/”这一个模式字符串,并且所有请求的 URI 都能与之匹配,自然所有请求都会被我们设置的处理函数处理。
第一个go程序: HTTP 服务示例相关推荐
- Zookeeper: 一个分布式应用程序协调服务
Zookeeper: A Service for Coordinating Processes of Distributed Applications A Scalable,reliable,robu ...
- vps没有mysql怎么用商店_如何在本地搞一个小程序的服务器之我没有vps我也很绝望呀...
睡醒再说...要是还记得这事的话.... [题图为@樱花 我应该没圈错...] ===================好的我醒辣================= 嗯....有人猜到了我用的就是ngr ...
- 57 第一个Celery程序
我们以Redis为例,首先修改Redis配置文件redis.conf,修改bind=127.0.0.1为bind=0.0.0.0 , 意思是允许远程访问Redis数据库.接下来启动Redis: 启动成 ...
- .NET应用程序管理服务AMS设计
AMS全称是Application Management Server即应用程序管理服:由于经常要写些一些应用服务,每次部署和维护都比较麻烦,首先要针对服务编写一个windows服务程序方便系统启动里 ...
- EJB3.0学习笔记---第一个EJB程序:
第一个EJB程序: 开发服务端程序: 1.新建一个EJB project:EJBTest_01 2.在src下建包:com.credream.ejb 3.写接口:FirstEjb.java pac ...
- EJB3.0学习笔记--第一个EJB程序:
第一个EJB程序: 开发服务端程序: 1.新建一个EJB project:EJBTest_01 2.在src下建包:com.credream.ejb 3.写接口:FirstEjb.java pac ...
- Spring Restful Web服务示例 - 使用JSON/Jackson和客户端程序
Spring Restful Web服务示例 - 使用JSON/Jackson和客户端程序 Spring是最广泛使用的Java EE框架之一.我们之前已经看到了如何使用Spring MVC来创建基于J ...
- Spring Restful Web服务示例 - 使用JSON,Jackson和客户端程序
Spring Restful Web服务示例 - 使用JSON,Jackson和客户端程序 Spring是最广泛使用的Java EE框架之一.我们之前已经看到了如何使用Spring MVC来创建基于J ...
- 第一个Mybatis程序示例 Mybatis简介(一)
在JDBC小结中(可以参阅本人JDBC系列文章),介绍到了ORM,其中Mybatis就是一个不错的ORM框架 MyBatis由iBatis演化而来 iBATIS一词来源于"internet& ...
最新文章
- Paper4:Voxel-Based Extraction and Classification of 3-D Pole-Like Object From Mobile LIDAR Point Clo
- javascript优缺点_为什么要在JavaScript中使用静态类型? 优缺点
- 【JulyEdu-Python基础】第 8 课:Python第三方库
- Oracle 11g 11201_RHEL5.5_RAC_VBOX 详细搭建步骤
- Storm 1.0.1发布 .NET 适配也已到来
- MariaDB通过命令行的方式导出指定数据库和还原指定数据库
- 秒杀场景_解决秒杀超卖问题_04
- 禁止“挖矿”!谷歌杀了所有的 Chrome 扩展应用
- 华为机试HJ60:查找组成一个偶数最接近的两个素数
- 从头开发一个Flutter插件(一)开发流程
- android nv21 nv12,直接进行nv21或者nv12的resize
- 【密码学】基于 SM3 算法的 HMAC 快速实现
- 《机械工程测试技术基础》教学大纲
- 由中秋抢月饼事件想到的
- linux 进程 线程 优先级,Linux编程-线程优先级的设定
- cs学习使用4(代理)
- #创新应用#豆果美食:贴心的美食专家!
- [HDU 5755] Gambler Bo (高斯消元)
- 如何在 iPhone 上恢复已删除的短信
- 达人评测 酷睿i7 1195g7 和奔腾n6000选哪个
热门文章
- 7-5 服务器统一出错处理2
- 9-5 一致性哈希分区
- 16、document的_source元数据以及定制返回结果解析
- 1 为发现 php,magento 1.8.1中发现sitemap模块的一个bug
- 荣耀手表gspro会用鸿蒙,真实使用荣耀手表GS Pro功能用2个月评测反馈!一定看看如何!...
- 指针c语言教学,C语言指针的指针
- QThread与QObject的关系
- Python Imaging Library: ImageWin Module(图像Windows模块)
- PAT A1096 质因子分解
- 恶意软件利用Windows故障诊断平台传播