Skip to content

Latest commit

 

History

History
132 lines (78 loc) · 12 KB

File metadata and controls

132 lines (78 loc) · 12 KB

零、序言

我决定写Go 编程蓝图,因为我想消除这样一个神话,即 Go 作为一种相对年轻的语言和社区,对于快速编写和迭代软件来说是一个糟糕的选择。我有一个朋友,他在一个周末通过将已有的 gem 和库混合在一起,完成了完整的 Ruby-on-Rails 应用程序;Rails 作为一个平台,以支持快速开发而闻名。由于我对 Go 和不断增长的开源软件包的自助餐也做了同样的事情,我想分享一些真实世界的例子,说明我们如何快速构建和发布从第一天起就表现出色的软件,并准备在我们的项目以 Rails 无法与之竞争的方式启动时进行扩展。当然,大多数可伸缩性都发生在语言之外,但 Go 内置的并发性等功能意味着您甚至可以从最基本的硬件上获得一些非常令人印象深刻的结果,从而在事情开始变得真实时为您提供了一个良好的开端。

这本书探讨了五个非常不同的项目,其中任何一个都可以成为真正创业的基础。无论是低延迟的聊天应用程序、域名建议工具、基于 Twitter 的社交投票和选举服务,还是由 Google Places 提供动力的随机夜间发电机,每一章都涉及到许多用 Go 编写的产品或服务需要解决的问题。我在书中提出的解决方案只是解决每个项目的众多方法之一,我鼓励你们自己决定我是如何解决这些问题的。这些概念比代码本身更重要,但希望您能在这里和那里学到一些技巧和窍门,这些技巧和窍门可以应用到您的 go 工具带中。

我写这本书的过程可能很有趣,因为它代表了许多敏捷开发人员所采用的理念。首先,我给自己一个挑战,构建一个真正的可部署产品(尽管是一个简单的产品;如果你愿意的话,最低限度的可行产品),然后再投入其中并编写版本 1。一旦我让它工作起来,我会从头重写它。小说家和记者多次说,写作的艺术是重写;我发现软件也是如此。当我们第一次编写一段代码时,我们真正要做的就是了解这个问题以及如何解决它,并将我们的一些想法从头脑中转移到纸上(或文本编辑器中)。第二次写这篇文章时,我们正在应用我们的新知识来实际解决这个问题。如果您从未尝试过这一点,试一试,您可能会发现您的代码质量会像我一样急剧提高。这并不意味着第二次将是软件的最后一次进化,我们应该尽可能保持它的廉价和一次性,因此,如果它们过时或开始碍事,我们不介意扔掉它们。

我所有的代码都是按照测试驱动开发(TDD)实践编写的,其中一些我们将在整个章节中一起完成,有些您将在最终的代码中看到测试结果。所有的测试代码都可以在本书的 GitHub 存储库中找到,即使它没有包含在印刷品中。

一旦我完成了测试驱动的第二个版本,我就会开始写这一章,描述我是如何以及为什么这么做的。在大多数情况下,我采用的迭代方法没有出现在书中,因为它只会添加页面的调整和编辑,这可能会让读者感到沮丧。然而,在一些情况下,我们将一起迭代,以了解在编写 Go 包和程序时如何应用渐进改进和小迭代(开始并保持简单,并在绝对必要时引入复杂性)的过程。

2012 年我从英国搬到了美国,但这并不是为什么这些章节都是用美式英语编写的;这是出版商的要求。我想这本书是针对美国读者的,或者可能是因为美国英语是标准的计算语言(在英国代码中,处理颜色的属性拼写时没有 U)。不管怎样,我为任何跨大西洋的失误提前道歉;我知道程序员有多迂腐。

任何问题、改进、建议或辩论(我喜欢围棋社区以及核心团队和语言本身的固执己见)都是非常受欢迎的。这些可能会发生在专门设置在的书的 GitHub 发行版中 https://github.com/matryer/goblueprints 这样每个人都可以参加。

最后,如果有人在这些项目的基础上成立一家初创公司,或者在其他地方利用这些项目,我会非常激动。我很想知道这件事;你可以在@matryer给我发推特,让我知道任何一种方式。

这本书涵盖的内容

第 1 章带有 Web 套接字的聊天应用程序展示了如何构建一个完整的 Web 应用程序,允许多人在其 Web 浏览器中进行实时对话。我们看到 net/http 包如何让我们提供 HTML 页面,以及如何使用 web 套接字连接到客户端浏览器。

第 2 章添加身份验证展示了如何将 OAuth 添加到我们的聊天应用程序中,以便我们可以跟踪谁在说什么,但让他们使用 Google、Facebook 或 GitHub 登录。

第 3 章实现个人资料图片的三种方式,介绍了如何将个人资料图片添加到聊天应用程序中,这些图片可以从身份验证服务Gravitar.comweb 服务中获取,也可以允许用户从硬盘上传自己的图片。

第 4 章查找域名的命令行工具,探讨了在 Go 中构建命令行工具是多么容易,并将这些技能用于解决为聊天应用程序查找完美域名的问题。它还探讨了如何轻松地使用标准输入和标准输出管道来生成一些非常强大的可组合工具。

第 5 章构建分布式系统并使用灵活的数据解释了如何通过构建一个由 NSQ 和 MongoDB 支持的高度可扩展的推特投票和计票引擎,为民主的未来做好准备。

第 6 章通过 RESTful 数据 Web 服务 API公开数据和功能,介绍如何通过 JSON Web 服务公开我们在第 5 章中构建的功能构建分布式系统并使用灵活的数据,具体来说,包装 http.HandlerFunc 函数为我们提供了强大的管道模式。

第 7 章随机推荐 Web 服务展示了如何使用 Google Places API 生成基于位置的随机推荐 API,该 API 代表了探索任何领域的有趣方式。本文还探讨了为什么保持内部数据结构私有、控制相同数据的公共视图非常重要,以及如何在 Go 中实现枚举器。

第 8 章文件系统备份,帮助我们为代码项目构建一个简单但功能强大的文件系统备份工具,并探索使用 Go 标准库的 os 包与文件系统交互。它还研究了 Go 的接口如何允许简单的抽象产生强大的结果。

附录稳定 Go 环境的良好实践向我们介绍了如何在新机器上从头开始安装 Go,并讨论了我们的一些环境选项及其对未来可能产生的影响。我们还将考虑协作可能如何影响我们的一些决策以及我们的包可能具有的开放源代码的影响。

这本书你需要什么

要编译和运行本书中的代码,您需要一台能够运行支持 Go 工具集的操作系统的计算机,其列表可在中找到 https://golang.org/doc/install#requirements

附录稳定 Go 环境的良好实践提供了一些安装 Go 和设置开发环境的有用技巧,包括如何使用 GOPATH 环境变量。

这本书是给谁的

本书面向所有围棋程序员,从希望通过构建真实项目来探索该语言的初学者,到对如何以有趣的方式应用该语言感兴趣的专家。

公约

在这本书中,你会发现许多不同类型的文本可以区分不同类型的信息。下面是这些风格的一些例子,并解释了它们的含义。

文本中的代码字、数据库表名、文件夹名、文件名、文件扩展名、路径名、虚拟 URL、用户输入和 Twitter 句柄如下所示:“我们可以在使用go get下载其他软件包后,使用import关键字使用其功能。”

代码块设置如下:

package meander
type Cost int8
const (
  _ Cost = iota
  Cost1
  Cost2
  Cost3
  Cost4
  Cost5
)

当我们希望提请您注意代码块的特定部分时,相关行或项目以粗体显示:

package meander
type Cost int8
const (
  _ Cost = iota
  Cost1
  Cost2
  Cost3
  Cost4
  Cost5
)

任何命令行输入或输出的编写方式如下:

go build -o project && ./project

新术语重要词语以粗体显示。例如,您在屏幕上、菜单或对话框中看到的文字会出现在文本中,如下所示:“安装 Xcode 后,您将打开首选项并导航到下载部分。

警告或重要注释显示在这样的框中。

提示

提示和技巧如下所示。

读者反馈

我们欢迎读者的反馈。让我们知道你对这本书的看法你喜欢或可能不喜欢什么。读者反馈对于我们开发您真正从中获益最多的标题非常重要。

要向我们发送一般反馈,只需向<[feedback@packtpub.com](mailto:feedback@packtpub.com)>发送电子邮件,并通过邮件主题提及书名即可。

如果您对某个主题有专业知识,并且您有兴趣撰写或贡献一本书,请参阅我们的作者指南,网址为www.packtpub.com/authors

客户支持

既然您是一本 Packt 图书的骄傲拥有者,我们有很多东西可以帮助您从购买中获得最大收益。

下载示例代码

您可以下载您在账户购买的所有 Packt 书籍的示例代码文件 http://www.packtpub.com 。如果您在其他地方购买了本书,您可以访问http://www.packtpub.com/support 并注册,将文件直接通过电子邮件发送给您。或者,在上查看本书的 GitHub 存储库 http://github.com/matryer/goblueprints

勘误表

虽然我们已尽一切努力确保内容的准确性,但错误确实会发生。如果您在我们的一本书中发现错误,可能是文本或代码中的错误,如果您能向我们报告,我们将不胜感激。通过这样做,您可以使其他读者免于沮丧,并帮助我们改进本书的后续版本。如果您发现任何错误,请访问进行报告 http://www.packtpub.com/submit-errata ,选择您的书籍,点击勘误表提交表单链接,输入您勘误表的详细信息。一旦您的勘误表得到验证,您的提交将被接受,勘误表将上传到我们的网站上,或添加到该标题勘误表部分的任何现有勘误表列表中。通过从中选择您的标题,可以查看任何现有勘误表 http://www.packtpub.com/support

盗版

在互联网上盗版版权材料是所有媒体的一个持续问题。在 Packt,我们非常重视版权和许可证的保护。如果您在互联网上发现我们作品的任何形式的非法复制品,请立即向我们提供地址或网站名称,以便我们采取补救措施。

请致电<[copyright@packtpub.com](mailto:copyright@packtpub.com)>与我们联系,并提供可疑盗版材料的链接。

我们感谢您在保护我们的作者方面的帮助,以及我们为您带来有价值内容的能力。

问题

如果您对本书的任何方面有疑问,请致电<[questions@packtpub.com](mailto:questions@packtpub.com)>与我们联系,我们将尽力解决。