前言
本版包含了许多激动人心的新主题,如编写 RESTful 服务、使用 WebSocket 协议,以及利用 GitHub Actions 和 GitLab Actions 进行 Go 项目的开发,还有泛型内容和许多实用工具的开发。此外,我努力使本版比第 2 版更加精简,并以更自然的结构安排内容,使其阅读起来更加轻松快捷,特别适合那些忙碌的专业人士。
我也努力在书中融入了适量的理论知识和实践内容——但只有您,亲爱的读者,才能评判我是否成功。请务必尝试每章末尾的练习,并在有任何建议或想法时,及时与我联系。
适用读者
本书是为那些希望将 Go 语言知识提升到更高水平的中级 Go 程序员准备的。对于那些希望学习 Go 语言,同时不想重复学习编程基础的经验丰富的其他编程语言开发者来说,本书也会非常有用。
本书内容
第 1 章首先讨论了 Go 语言的历史、Go 的重要特性及 Go 的优势。接着介绍了 godoc 实用程序和 go doc 工具,并解释了如何编译和执行 Go 程序。之后,讨论了打印输出和获取用户输入、处理命令行参数及使用日志文件。最后,开发了一个基本的电话簿应用程序版本,并将在接下来的章节中不断改进它。
第 2 章讨论了 Go 语言的基础数据类型,包括数值型和非数值型,以及将相似数据类型的数据分组的数组和切片。本章还涉及了 Go 语言的指针、常量及处理日期和时间。最后是关于生成随机数,以及使用随机数据更新电话簿应用程序。
第 3 章从映射(maps)开始,然后深入结构体和结构体关键字(struct)。此外,还讨论了正则表达式、模式匹配及处理 CSV 文件。最后,通过为电话簿应用程序添加数据持久性来改进它。
第 4 章讲述了反射、接口以及类型方法,这些是附加到数据类型上的功能。本章还包括使用 sort.Interface 接口对切片进行排序、空接口的使用、类型断言、类型开关及错误数据类型。此外,讨论了 Go 如何模拟一些面向对象的概念,然后对电话簿应用程序进行了改进。
第 5 章全面介绍了包、模块以及作为包主要元素的函数。在本章中,创建了一个用于与 PostgreSQL 数据库交互的 Go 包,为其编写了文档,并解释了有时难以掌握的 defer 关键字的使用。此外还包含了关于使用 GitLab Runners 和 GitHub Actions 进行自动化的信息,以及如何为 Go 二进制文件创建 Docker 镜像。
第 6 章是关于系统编程的,包括处理命令行参数、处理 UNIX 信号、文件输入输出、io.Reader 和 io.Writer 接口,以及使用 viper 和 cobra 包等主题。此外,讨论了处理 JSON、XML 和 YAML 文件,创建了一个方便的命令行工具用于发现 UNIX 文件系统中的循环,并讨论了在 Go 二进制文件中嵌入文件,以及 os.ReadDir()函数、os.DirEntry 类型和 io/fs 包的使用。最后,更新了电话簿应用程序以使用 JSON 数据,并在 cobra 包的帮助下将其转换为一个合适的命令行工具。
第 7 章讨论了 goroutines、channels 和 pipelines。介绍了进程、线程和 goroutines 之间的区别,sync 包,以及 Go 调度器的运作方式。此外,探索了 select 关键字的使用,讨论了 Go channels 的各种“类型”,以及共享内存、互斥锁、sync.Mutex 类型和 sync.RWMutex 类型。最后其余部分讨论了 context 包、semaphore 包、工作池、如何对 goroutines 设置超时,以及如何检测竞态条件。
第 8 章讨论了 net/http 包,Web 服务器和 Web 服务的开发,将指标暴露给 Prometheus,在 Grafana 中可视化指标,开发 Web 客户端和创建文件服务器。最后还把电话簿应用程序转换为 Web 服务,并为其创建了一个命令行客户端。
第 9 章涉及 net 包、TCP/IP,以及 TCP 和 UDP 协议,还有 UNIX 域套接字和 WebSocket 协议。最后开发了许多网络服务器和客户端。
第 10 章全面介绍了 REST API 和 RESTful 服务的使用。学习如何定义 REST API,开发强大的并发 RESTful 服务器,以及作为 RESTful 服务客户端的命令行工具。最后介绍了 Swagger 用于创建 REST API 文档,并学习了如何上传和下载二进制文件。
第 11 章讨论了代码测试、代码优化和代码性能分析,交叉编译、基准测试 Go 代码、创建示例函数、使用 go:generate,以及寻找不可达的 Go 代码。
第 12 章全面介绍了在 Go 中使用 gRPC。gRPC 是由 Google 开发的 RESTful 服务的替代品。同时阐述了如何定义 gRPC 服务的方法和消息,如何将它们转换为 Go 代码,以及如何为该 gRPC 服务开发服务器和客户端。
第 13 章是关于泛型,以及如何使用新语法编写泛型函数和定义泛型数据类型。
附录讲述了 Go 垃圾收集器的运作,并阐述了这个 Go 组件如何影响代码性能。
如何利用本书
本书需要一台安装了相对较新版本的 UNIX 计算机,这包括任何运行 macOS X、macOS 或 Linux 的机器。大部分展示的代码在不作任何修改的情况下也可以在 Microsoft Windows 机器上运行。
为了最大限度地利用本书,您应该尽快尝试将每一章的知识应用到自己的程序中,并看看哪些有效,哪些无效。正如我之前告诉您的,尝试解决每章末尾的练习题,或者创建您自己的编程问题。
