目录

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 服务示例相关推荐

  1. Zookeeper: 一个分布式应用程序协调服务

    Zookeeper: A Service for Coordinating Processes of Distributed Applications A Scalable,reliable,robu ...

  2. vps没有mysql怎么用商店_如何在本地搞一个小程序的服务器之我没有vps我也很绝望呀...

    睡醒再说...要是还记得这事的话.... [题图为@樱花 我应该没圈错...] ===================好的我醒辣================= 嗯....有人猜到了我用的就是ngr ...

  3. 57 第一个Celery程序

    我们以Redis为例,首先修改Redis配置文件redis.conf,修改bind=127.0.0.1为bind=0.0.0.0 , 意思是允许远程访问Redis数据库.接下来启动Redis: 启动成 ...

  4. .NET应用程序管理服务AMS设计

    AMS全称是Application Management Server即应用程序管理服:由于经常要写些一些应用服务,每次部署和维护都比较麻烦,首先要针对服务编写一个windows服务程序方便系统启动里 ...

  5. EJB3.0学习笔记---第一个EJB程序:

    第一个EJB程序: 开发服务端程序: 1.新建一个EJB project:EJBTest_01 2.在src下建包:com.credream.ejb 3.写接口:FirstEjb.java   pac ...

  6. EJB3.0学习笔记--第一个EJB程序:

    第一个EJB程序: 开发服务端程序: 1.新建一个EJB project:EJBTest_01 2.在src下建包:com.credream.ejb 3.写接口:FirstEjb.java   pac ...

  7. Spring Restful Web服务示例 - 使用JSON/Jackson和客户端程序

    Spring Restful Web服务示例 - 使用JSON/Jackson和客户端程序 Spring是最广泛使用的Java EE框架之一.我们之前已经看到了如何使用Spring MVC来创建基于J ...

  8. Spring Restful Web服务示例 - 使用JSON,Jackson和客户端程序

    Spring Restful Web服务示例 - 使用JSON,Jackson和客户端程序 Spring是最广泛使用的Java EE框架之一.我们之前已经看到了如何使用Spring MVC来创建基于J ...

  9. 第一个Mybatis程序示例 Mybatis简介(一)

    在JDBC小结中(可以参阅本人JDBC系列文章),介绍到了ORM,其中Mybatis就是一个不错的ORM框架 MyBatis由iBatis演化而来 iBATIS一词来源于"internet& ...

最新文章

  1. Paper4:Voxel-Based Extraction and Classification of 3-D Pole-Like Object From Mobile LIDAR Point Clo
  2. javascript优缺点_为什么要在JavaScript中使用静态类型? 优缺点
  3. 【JulyEdu-Python基础】第 8 课:Python第三方库
  4. Oracle 11g 11201_RHEL5.5_RAC_VBOX 详细搭建步骤
  5. Storm 1.0.1发布 .NET 适配也已到来
  6. MariaDB通过命令行的方式导出指定数据库和还原指定数据库
  7. 秒杀场景_解决秒杀超卖问题_04
  8. 禁止“挖矿”!谷歌杀了所有的 Chrome 扩展应用
  9. 华为机试HJ60:查找组成一个偶数最接近的两个素数
  10. 从头开发一个Flutter插件(一)开发流程
  11. android nv21 nv12,直接进行nv21或者nv12的resize
  12. 【密码学】基于 SM3 算法的 HMAC 快速实现
  13. 《机械工程测试技术基础》教学大纲
  14. 由中秋抢月饼事件想到的
  15. linux 进程 线程 优先级,Linux编程-线程优先级的设定
  16. cs学习使用4(代理)
  17. #创新应用#豆果美食:贴心的美食专家!
  18. [HDU 5755] Gambler Bo (高斯消元)
  19. 如何在 iPhone 上恢复已删除的短信
  20. 达人评测 酷睿i7 1195g7 和奔腾n6000选哪个

热门文章

  1. 7-5 服务器统一出错处理2
  2. 9-5 一致性哈希分区
  3. 16、document的_source元数据以及定制返回结果解析
  4. 1 为发现 php,magento 1.8.1中发现sitemap模块的一个bug
  5. 荣耀手表gspro会用鸿蒙,真实使用荣耀手表GS Pro功能用2个月评测反馈!一定看看如何!...
  6. 指针c语言教学,C语言指针的指针
  7. QThread与QObject的关系
  8. Python Imaging Library: ImageWin Module(图像Windows模块)
  9. PAT A1096 质因子分解
  10. 恶意软件利用Windows故障诊断平台传播