Go Systems Programming是一本帮助您使用 Go 开发系统软件的书,Go 是一种系统编程语言,在流行之前,它最初是 Google 内部项目。Go 真正流行的原因是,它通过易于编写、易于阅读、易于理解以及拥有一个编译器来帮助您,让开发人员感到高兴。这本书并没有涵盖 Go 编程语言的每一个可能的方面和特性:只涉及与系统编程相关的方面。如果您想了解更多关于 Go 编程语言的知识,请等待我的下一本书精通 Go,该书将于 2018 年出版!
您将要阅读的这本书是一本诚实的书,它将在不忽略其潜在错误、限制和逻辑缺陷的情况下展示运行的 Go 代码,这将允许您自己对其进行改进,并在将来创建更好的版本。您无法改进的是将要呈现的基本信息,这是 Unix 系统工作方式的基础。我会认为这本书是成功的,如果它有助于你理解系统编程是什么,为什么它是重要的,以及你如何开始在 GO 中开发系统软件。如果 Go 成为你最喜欢的编程语言,我也同样高兴!
第 1 章、Go 和 Unix 系统编程入门,首先定义什么是系统编程,然后讨论 Go 的优缺点、Go 版本 1.8 的特性、两个名为gofmt
和godoc
的便捷 Go 工具,以及 Unix 进程的各种状态。
第 2 章在 Go中编写程序,帮助您了解如何编译 Go 代码以及如何使用 Go 支持的环境变量,了解 Go 如何读取程序的命令行参数。然后,我们将讨论获取用户输入和输出,这是基本任务,向您展示如何在 Go 中定义函数,本书首次提到了defer
关键字,并通过使用方便的代码示例讨论 Go 提供的数据结构来继续。在本章的其余部分中,我们将讨论 Go 接口和随机数生成。我相信你会喜欢这一章的!
第 3 章高级 Go 功能更深入,并开始讨论一些高级 Go 功能,包括错误处理,这在开发系统软件和错误记录时非常关键。然后介绍模式匹配和正则表达式、Go 反射,并讨论不安全代码。之后,它将 Go 与其他编程语言进行了比较,并提供了两个实用程序,分别名为dtrace(1)
和strace(1)
,它们允许您在执行程序时查看幕后发生的情况。最后,它讨论了如何使用go tool
来检测无法访问的代码,以及如何避免一些常见的 Go 错误。
第 4 章Go 包、算法和数据结构介绍了 Go 中的算法和排序,以及需要 Go 版本 1.8 或更高版本的sort.Slice()
功能。然后展示了链表、二叉树和哈希表的 Go 实现。之后,它将讨论 Go 软件包,并教您如何创建和使用自己的 Go 软件包。本章的最后一部分讨论 Go 中的垃圾收集。
第 5 章文件和目录是本书的第一章,涉及系统编程主题,即文件、符号链接和目录的处理。在本章中,您将看到 Unix 工具的核心功能的 Go 实现,如which(1)
、pwd(1)
和find(1)
,但首先您将学习如何使用flag
包来解析 Go 程序的命令行参数和选项。此外,您还将学习如何删除、重命名和移动文件,以及如何遍历目录结构。本章的最后一部分实现了一个实用程序,它可以创建目录结构中所有目录的副本!
第 6 章文件输入和输出向您展示了如何读取文件内容,如何更改内容,以及如何将自己的数据写入文件!在本章中,您将了解io
包、io.Writer
和io.Reader
接口以及用于缓冲输入和输出的bufio
包。您还将创建cp(1)
、wc(1)
和dd(1)
实用程序的 Go 版本。最后,您将了解稀疏文件、如何在 Go 中创建稀疏文件、如何从文件中读取和写入记录以及如何在 Go 中锁定文件。
第 7 章处理系统文件教您如何处理 Unix 系统文件,包括将数据写入 Unix 日志文件、将数据附加到现有文件以及更改文本文件的数据。在本章中,您还将了解日志和log/syslog
标准 Go 软件包,了解 Unix 文件权限,并通过实际示例进一步了解模式匹配和正则表达式知识。您还将了解如何查找用户的用户 ID 以及用户所属的 Unix 组。最后,您将了解如何使用time
包处理 Go 中的日期和时间,以及如何自己创建和旋转日志文件。
第 8 章进程和信号首先讨论了在 Go 中借助os/signal
包处理 Unix 信号,并介绍了三个 Go 程序。然后,它显示了一个 Go 程序,该程序可以使用信号和信号处理来旋转其日志文件,以及另一个 Go 程序,该程序使用信号来显示文件复制操作的进度。本章还将教您如何在 Go 中绘制数据,以及如何在 Go 中实现 Unix 管道。然后它将在 Go 中实现cat(1)
实用程序,然后简要介绍 Unix 套接字客户端的 Go 代码。本章的最后一节将快速讨论如何在 Go 中编写 unixshell。
第 9 章Goroutines-基本功能讨论了一个非常重要的 Go 主题,即 Goroutines,通过讨论如何创建 Goroutines 以及如何同步 Goroutines 并在结束程序之前等待它们完成。然后讨论通道和管道,它们帮助 goroutines 以安全的方式进行通信和交换数据。本章的最后一部分介绍了使用 goroutines 实现的wc(1)
实用程序的一个版本。然而,由于 goroutines 是一个大主题,下一章将继续讨论它们。
第 10 章Goroutines-高级功能讲述了与 Goroutines 和通道相关的更高级主题,包括缓冲通道、信号通道、零通道、通道通道的通道、超时和select
关键字。然后讨论与共享内存和互斥体相关的问题,然后再介绍两个使用通道和共享内存的wc(1)
实用程序的 Go 版本。最后,本章将讨论种族条件和GOMAXPROCS
环境变量。
第 11 章在 Go 中编写 Web 应用,讲述在 Go 中开发 Web 应用、Web 服务器和客户端。此外,还讨论了使用 Go 代码与 MongoDB 和 MySQL 数据库通信。然后,它说明了如何使用html/template
包,它是 Go 标准库的一部分,允许您使用 Go HTML 模板文件生成 HTML 输出。最后,它讨论了在呈现一个实用程序之前读取和写入 JSON 数据,该实用程序读取大量网页并返回在这些网页中找到给定关键字的次数。
第 12 章网络编程使用net
Go 标准包讨论 TCP/IP 及其协议相关主题。它向您展示了如何创建 TCP 和 UDP 客户端和服务器,如何执行各种类型的 DNS 查找,以及如何使用 Wireshark 检查网络流量。此外,它还讨论了在 Go 中开发 RPC 客户端和服务器,以及开发 Unix 套接字服务器和 Unix 套接字客户端。
正如您将看到的,在每章的末尾,都有一些练习供您进行,以便获得有关重要Go软件包的更多信息,并编写您自己的Go程序。请试着做这本书的所有练习。
这本书需要一台运行 Unix 变体的计算机,其 Go 版本相对较新,包括运行 MacOSX、macOS 或 Linux 的任何计算机。
苹果曾经将其操作系统命名为 MacOSX,后跟版本号;然而,在 Mac OS X 10.11(El Capitan)之后,苹果改变了这一点,Mac OS X 10.12 现在被称为 macOS 10.12(Sierra)——在本书中,术语 macOS X 和 macOS 可以互换使用。此外,在您阅读本书时,macOS 的最新版本很有可能是 macOS 10.13(High Sierra)。您可以访问了解更多关于 macOS 各种版本的信息 https://en.wikipedia.org/wiki/MacOS 。
本书中的所有 Go 代码都已经过测试,使用 macOS 10.12 Sierra 在 iMac 上运行 Go 1.8.x,在 Debian Linux 机器上运行 Go 1.3.3。大多数代码可以在两个 Go 版本上运行,而无需任何代码更改。但是,当使用较新的 Go 功能时,代码将无法使用 Go 1.3.3 进行编译:本书说明了不会使用 Go 版本 1.3.3 进行编译或需要 Go 版本 1.8 或更高版本的 Go 程序。
请注意,在撰写本文时,最新的 Go 版本是 1.9。考虑到 Go 的工作方式,您将能够在较新的 Go 版本中编译本书的所有 Go 代码,而无需任何更改。
本书面向 Unix 用户、高级 Unix 用户、Unix 系统管理员和 Unix 系统开发人员,他们使用 Go-on 一个或多个 Unix 变体并希望开始使用 Go 编程语言开发系统软件。
虽然这本书对于那些对 Unix 操作系统感到不舒服的人或者没有编程经验的人来说可能不是最好的选择,但是业余程序员会发现很多关于 Unix 的实用信息,这些信息可能会激励他们开始开发自己的系统实用程序。
在本书中,您将发现许多文本样式可以区分不同类型的信息。下面是这些风格的一些例子,并解释了它们的含义。文本中的代码字、数据库表名、文件夹名、文件名、文件扩展名、路径名、虚拟 URL、用户输入和 Twitter 句柄如下所示:“这是因为main()
函数是程序执行的开始。”
代码块设置如下:
package main
import "fmt"
import "os"
func main() {
arguments := os.Args
for i := 0; i < len(arguments); i++ {
fmt.Println(arguments[i])
}
}
当我们希望提请您注意代码块的特定部分时,相关行或项目以粗体显示:
package main
import "fmt"
import "os"
func main() {
arguments := os.Args
for i := 0; i < len(arguments); i++ {
fmt.Println(arguments[i])
}
}
任何命令行输入或输出的编写方式如下:
$ go run hw.go
Hello World!
新术语和重要词语以粗体显示。
警告或重要提示如下所示。
提示和技巧如下所示。
我们欢迎读者的反馈。让我们知道你对这本书的看法你喜欢还是不喜欢。读者反馈对我们来说很重要,因为它可以帮助我们开发出您将真正从中获得最大收益的标题。要向我们发送一般反馈,只需发送电子邮件feedback@packtpub.com
,并在邮件主题中提及该书的标题。如果您对某个主题有专业知识,并且您有兴趣撰写或贡献一本书,请参阅我们的作者指南www.packtpub.com/authors。
既然您是一本 Packt 图书的骄傲拥有者,我们有很多东西可以帮助您从购买中获得最大收益。
您可以从您的帐户下载本书的示例代码文件 http://www.packtpub.com 。如果您在其他地方购买了本书,您可以访问http://www.packtpub.com/support 并注册,将文件直接通过电子邮件发送给您。您可以通过以下步骤下载代码文件:
- 使用您的电子邮件地址和密码登录或注册我们的网站。
- 将鼠标指针悬停在顶部的“支持”选项卡上。
- 点击代码下载和勘误表。
- 在搜索框中输入图书的名称。
- 选择要下载代码文件的书籍。
- 从您购买本书的下拉菜单中选择。
- 点击代码下载。
下载文件后,请确保使用以下最新版本解压或解压缩文件夹:
- WinRAR/7-Zip for Windows
- 适用于 Mac 的 Zipeg/iZip/UnRarX
- 适用于 Linux 的 7-Zip/PeaZip
该书的代码包也托管在 GitHub 上的https://github.com/PacktPublishing/Go-Systems-Programming 。我们在上还提供了丰富的书籍和视频目录中的其他代码包 https://github.com/PacktPublishing/ 。看看他们!
我们还为您提供了一个 PDF 文件,其中包含本书中使用的屏幕截图/图表的彩色图像。彩色图像将帮助您更好地了解输出中的更改。您可以从下载此文件 https://www.packtpub.com/sites/default/files/downloads/GoSystemsProgramming_ColorImages.pdf 。
虽然我们已尽一切努力确保内容的准确性,但错误确实会发生。如果您在我们的一本书中发现错误,可能是文本或代码中的错误,如果您能向我们报告,我们将不胜感激。通过这样做,您可以使其他读者免于沮丧,并帮助我们改进本书的后续版本。如果您发现任何错误,请访问进行报告 http://www.packtpub.com/submit-errata ,选择您的书籍,点击勘误表提交表单链接,然后输入勘误表的详细信息。一旦您的勘误表得到验证,您的提交将被接受,勘误表将上载到我们的网站或添加到该标题勘误表部分下的任何现有勘误表列表中。要查看之前提交的勘误表,请转至https://www.packtpub.com/books/content/support 并在搜索字段中输入图书名称。所需信息将出现在勘误表部分下。
在互联网上盗版版权材料是所有媒体都面临的一个持续问题。在 Packt,我们非常重视版权和许可证的保护。如果您在互联网上发现任何形式的非法复制品,请立即向我们提供地址或网站名称,以便我们采取补救措施。请致电copyright@packtpub.com
与我们联系,并提供可疑盗版材料的链接。我们感谢您在保护我们的作者方面提供的帮助以及我们为您带来有价值内容的能力。
如果您对本书的任何方面有任何问题,可以通过questions@packtpub.com
与我们联系,我们将尽力解决该问题。