Tony Bai · Go 语言第一课
Tony Bai
资深架构师,tonybai.com 博主
21492 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 59 讲
开篇词 (1讲)
结束语 (1讲)
Tony Bai · Go 语言第一课
15
15
1.0x
00:00/00:00
登录|注册

09|即学即练:构建一个Web服务就是这么简单

服务运行与验证
Middleware实现
处理函数实现
HTTP API服务提供
内存map存储实现
工厂模式实现
存储方式抽象
优雅退出实现
主要模块初始化与组装
项目结构布局设计
Go Module创建
RESTful风格设计
CRUD操作
最长前缀匹配
处理函数原型
HandleFunc函数
ListenAndServe函数
net/http包
挑战练习
学习风格
学习收获
HTTP服务模块
图书数据存储模块
项目main包
项目建立与布局设计
业务逻辑
编译、运行与验证
HTTP请求处理
HTTP服务构建
自带电池的标准库
完善的工具链
面向工程特性
Go入口函数
Go包的初始化次序
Go开发环境安装
资源链接
思考题
小结
图书管理API服务
最简单的HTTP服务
Go语言特性
Go语言基础
构建Web服务

该思维导图由 AI 生成,仅供参考

你好,我是 Tony Bai。
在入门篇前面的几节课中,我们已经从 Go 开发环境的安装,一路讲到了 Go 包的初始化次序与 Go 入口函数。讲解这些,不仅仅是因为它们是你学习 Go 语言的基础,同时我也想为你建立“手勤”的意识打好基础。
作为 Go 语言学习的“过来人”,学到这个阶段,我深知你心里都在跃跃欲试,想将前面学到的知识综合运用起来,实现一个属于自己的 Go 程序。但到目前为止,我们还没有开始 Go 基础语法的系统学习,你肯定会有一种“无米下炊”的感觉。
不用担心,我在这节课安排了一个实战小项目。在这个小项目里,我希望你不要困在各种语法里,而是先跟着我““照猫画虎”地写一遍、跑一次,感受 Go 项目的结构,体会 Go 语言的魅力。

预热:最简单的 HTTP 服务

在想选择以什么类型的项目的时候,我还颇费了一番脑筋。我查阅了Go 官方用户 2020 调查报告,找到 Go 应用最广泛的领域调查结果图,如下所示:
我们看到,Go 应用的前 4 个领域中,有两个都是 Web 服务相关的。一个是排在第一位的 API/RPC 服务,另一个是排在第四位的 Web 服务(返回 html 页面)。考虑到后续你把 Go 应用于 Web 服务领域的机会比较大,所以,在这节课我们就选择一个 Web 服务项目作为实战小项目。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文以Go语言为例,通过简单的HTTP服务项目和图书管理API服务项目,向读者展示了如何使用Go语言轻松构建Web服务。文章首先介绍了如何创建一个最简单的HTTP服务,通过Go标准库的net/http包实现了一个简单的服务,展示了服务端处理客户端请求的过程。接着,文章详细介绍了图书管理API服务的业务逻辑,并给出了项目的结构布局和最终实现的源码文件分布情况。通过这些实例,读者可以初步了解Go语言构建Web服务的简单性和实用性。文章内容通俗易懂,适合初学者快速了解Go语言构建Web服务的基本原理和实践方法。文章还介绍了图书数据存储模块的实现和HTTP服务模块的优雅退出实现,展示了Go语言中模块化和接口设计的特点。整体而言,本文为读者提供了一个清晰的示例,帮助他们快速了解Go语言构建Web服务的基本流程和关键技术点。文章内容涵盖了HTTP服务模块的创建、处理函数的实现、middleware的使用以及程序的编译、运行与验证,为读者提供了全面的学习指导。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《Tony Bai · Go 语言第一课》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(87)

  • 最新
  • 精选
  • 扣剑书生
    store.go提供了 图书 和 接口的模板 factory 用于生产 接口实例 memstore.go 用于具体实现一个接口实例,实现其方法,并把样例发送到工厂 server.go 用于把路由和接口的方法对接起来

    作者回复: 👍

    2021-11-30
    2
    24
  • 尧九之阳
    Go现在有流行的web服务器框架么?

    作者回复: go最初有很多web框架,经过多年演进,目前gin这个web框架似乎成为了go社区的首选。

    2021-11-10
    2
    11
  • 布凡
    终于实验成功: 以下几个点需注意: 1、项目应放到 gopath货goroot相关的目录下,否则本地包的引用会报错,报错信息如下:"could not import errors (cannot find package "errors" in any of c:\go\src\errors (from $GOROOT)...)" 2、如果是复制的代码应该注意文件格式,可能报错"package main: read unexpected NUL in input"

    作者回复: 项目都是在mac/linux上做的。但理论上windows可以直接使用。你提到的项目放在gopath或goroot下是不必要的。支持go module模式后,如果启用了go module构建模式,放在哪个目录下都是可以的。 另外项目代码放在了github上,在文章末尾有链接。可直接clone后使用。

    2021-11-04
    4
    8
  • 猫饼
    我果然还是太菜了 我开始看不懂了

    作者回复: 先“照猫画虎”吧。一旦涉及此类实战小项目,必然会有没有系统学习的内容。后面学习新语法时,可以回过头来复习。

    2021-11-02
    2
    8
  • 老师的这个示例,麻雀虽小,五脏俱全。不过main.go里有一点疑问:http.Server.Shutdown(ctx)被调用后,http.Server.ListenAndServe()方法马上会返回error吧,按照实例代码里的写法,接收到中断信号后,马上调用Shutdown方法,此时errChan会返回ErrServerClosed,select逻辑走完,main方法就退出了,而go的http包里示意了我们需要确保shutdown调用后,整个代码不能马上退出,请老师解惑。。

    作者回复: 好问题! 首先errChan并不是等shutdown之后 listenAndServe报错的。而是等运行国产中,listenandserve一旦报错,程序可以退出。 接下来,我们再说说优雅退出。按照你的描述,我翻了一下net.http的文档: “Shutdown gracefully shuts down the server without interrupting any active connections. Shutdown works by first closing all open listeners, then closing all idle connections, and then waiting indefinitely for connections to return to idle and then shut down. If the provided context expires before the shutdown is complete, Shutdown returns the context's error, otherwise it returns any error returned from closing the Server's underlying Listener(s).” 我的理解是调用Shutdown后,ListenAndServe()方法的确会马上返回,不过这个无所谓了,listenandserver只是将listen端口关闭,不接受新连接了。 真正等待存量连接处理完毕的是shutdown方法,shutdown方法调用后,不是马上退出的哦。shutdown方法有一个ctx,专栏中传入了一个timeout ctx,时间为1s。即等待1s。关键就在这里。在生产环境,我们可能不能无限期等待程序退出,我们会设置一个timeout。如果shutdown在1s内完成等待,成功退出,这是最理想的。如果shutdown没有在1s内完成等待,即存量连接还没有处理完,那么按照我们的约定,我们也不能再等了。 当然这里只是demo,使用的timeout=1s。在生产中,你可以根据业务的类型以及经验值来等待。甚至可以进行无限等待,这完全取决于你的系统。

    2022-02-21
    2
    7
  • lesserror
    感谢 Tony Bai 老师这样由浅入深,并且尽可能贴近实战的讲解。 有以下困惑,麻烦解忧。 1. 对于一个module中,相同的包名,go内部是根据文件位置的不同,加以区分的吧? 例如:bookstore/store 和 bookstore/internal/store 这两个 package 同名,但是文件的路径不同,所以并不会有什么问题。如果在同一个package中,导入另一个同名的package,最佳实践是取个别名,我的理解没错吧? 2. 另外在 memstore.go 中的 包导入语句中: factory "bookstore/store/factory",这个 默认使用的是factory名字,不需要再另起名字为factory吧? 3. 这门课中的知识和你在另外的一个平台的《改善Go语言编程质量的50个有效实践》的内容重合度大吗? 精力有限,如果重合度大,就专心看这个就好了。 4. 这门课会讲讲Go写RPC服务方面的知识吗? 这个在生产中挺常用的。

    作者回复: 问题1. 你的理解没有错。 问题2. 可以不用另起,记得好像有些工具在格式化时会自动填上。 3. 定位不同,这个是入门专栏。那个进阶专栏。有很小部分有相似的地方,但讲解方式都做了调整和优化。建议学完这个专栏后,再去看看那个专栏。 4. rpc封装的很深,如果仅是使用的话,没啥东西。这个专栏更多聚焦于go语法以及尽量使用标准库的东西做一些实用程序和项目。

    2021-11-02
    5
    5
  • includestdio.h
    作为基本0基础学go,这一节完全没看懂-,- 把后面的基础篇看完回来再试试吧

    作者回复: 这一讲开头我就说了:“在这个小项目里,我希望你不要困在各种语法里,而是先跟着我““照猫画虎”地写一遍、跑一次,感受 Go 项目的结构,体会 Go 语言的魅力。” 😁 不用担心,往后学一学之后再来复习。

    2022-03-28
    2
    4
  • 小明
    能在gitee 上也放一份吗?github现在已经没那么友好了

    作者回复: good idea。已创建https://gitee.com/bigwhite/publication/tree/master/column/timegeek/go-first-course 供下载。

    2022-03-20
    3
    4
  • 左耳朵东
    server/server.go 文件中 select 那里,第二个 case 的意思是定时 1 秒后就会触发,从而执行后面的 return,为什么服务没有终止一直在运行呢?麻烦老师解答一下

    作者回复: 你说的是func (bs *BookStoreServer) ListenAndServe这个方法吧?这个函数等待1s后返回啊。但它启动的子goroutine依旧在运行的。子goroutine中bs.srv.ListenAndServe一直在工作,并提供服务。

    2021-12-03
    3
    4
  • snow
    我看这里使用了mux包,我只用过gin包,请问这两个老师更喜欢哪个?以及这里选择mux的原因。

    作者回复: 原则就是如果标准库中的mux可以满足,尽量不引用第三方包。如果标准库无法满足,尽量引用规模较小的包。gin是更大的web框架。除了mux,还有很多其他功能。如果不是项目必需,使用更“专一”的包可能更好。

    2021-11-05
    4
收起评论
显示
设置
留言
87
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部