Skip to content

Latest commit

 

History

History
386 lines (228 loc) · 30.8 KB

01.md

File metadata and controls

386 lines (228 loc) · 30.8 KB

一、Go 安全简介

安全和隐私作为实际问题,继续受到关注,特别是在技术行业。网络安全市场正在蓬勃发展并持续增长。随着创新和研究的不断涌现,该行业发展迅速。不仅提高了安全性的兴趣和速度,而且应用的规模和风险也以数量级的速度增长。业界需要一种易于学习、跨平台、大规模高效的编程语言。Go 是完美的选择,它拥有强大的标准库、短的学习曲线和极快的速度。

在本章中,我们将介绍以下主题:

  • Go's history, language design, criticisms, community, and learning tips
  • 为什么使用 Go 进行安全保护
  • 设置开发环境并编写第一个程序
  • 运行示例程序

About Go

Go 是一种开源编程语言,由 Google 创建,并在 BSD 风格的许可下发布。BSD 许可证允许任何人免费使用 Go,只要保留版权声明,并且谷歌名称不用于背书或推广。Go 受 C 的影响很大,但语法更简单,内存安全性和垃圾收集更好。有时候,GO 被描述成现代的 C++。我认为这太简单了,但Go绝对是一种简单但现代的语言。

Go语言设计

Go 最初的目标是创建一种简单、可靠和高效的新语言。如前所述,Go 深受 C 编程语言的影响。语言本身非常简单,只有 25 个关键字。它是为了与 IDE 很好地集成而构建的,但并不依赖于 IDE。根据我的经验,任何尝试过 Go 的人都会发现它非常友好,学习曲线很短。

GO 的主要目标之一是处理 C++和 java 代码的一些负面方面,同时保留性能。该语言需要简单且一致,以管理非常大的开发团队。

变量是静态类型的,应用被快速编译为静态链接的二进制文件。使用一个静态链接的二进制文件可以很容易地创建轻量级容器。最终的应用运行速度也很快,运行接近 C++和 java 性能,比解释语言如 Python 快得多。有指针,但不允许使用指针算术。Go 并不标榜自己是一种面向对象的编程语言,也没有传统意义上的;然而,它确实包含许多与面向对象编程语言非常相似的机制。下一章将对此进行更深入的讨论。接口被大量使用,组合相当于继承。

Go有许多有趣的特点。一个突出的特性是内置的并发性。只要在任何函数调用之前加上“go”这个词,就会产生一个轻量级线程来执行函数。另一个非常重要的特性是依赖关系管理,它非常有效。依赖关系管理是 Go 编译速度极快的部分原因。它不重复使用相同的头文件,方式是 C++。Go 还具有内置的内存安全性,垃圾收集器负责清理未使用的内存。Go 中的标准库也令人印象深刻。它是现代的,包含网络、HTTP、TLS、XML、JSON、数据库、图像处理和加密软件包。Go 还支持 Unicode,允许在源代码中使用各种字符。

Go工具链是生态系统的核心。它提供了下载和安装远程依赖项、运行单元测试和基准测试、生成代码以及根据 Go 格式化标准格式化代码的工具。它还包括编译器、链接器和汇编器,它们可以非常快速地编译,还可以通过简单地更改GOOSGOARCH环境变量来轻松地进行交叉编译。

Go 语言中排除了一些功能。泛型、继承、断言、异常、指针算术和隐式类型转换都被排除在外。故意省略了许多特性,即泛型、断言和指针算法。作者遗漏了一些特性,因为他们希望保持性能,使语言规范尽可能简单,或者他们无法就最佳实现方式达成一致,或者因为某个特性太有争议。继承也被有意地忽略了,取而代之的是使用接口和组合。其他一些特性,比如泛型,被忽略了,因为关于它们的正确实现有太多的争论,但是它们可能会出现在 Go2.0 中。作者们认识到,向一种语言添加一个特性要比删除一个特性容易得多。

The History of Go

Go是一种相对较年轻的语言,它于 2007 年开始使用,2009 年开放源码。它始于谷歌,是由罗伯特·格里默、罗伯特·派克和肯·汤普森共同完成的一个 20%的项目。20%的项目意味着该项目的开发人员将 20%的时间花在了实验性项目上。Go 1.0 于 2012 年 3 月正式发布。它从一开始就计划成为一种开源语言。在 Go 1.5 之前,编译器、链接器和汇编程序都是用 C 编写的。在版本 1.5 之后,一切都是用 Go 编写的。

谷歌最初推出了 Go for Linux 和 macOS,社区推动了其他平台的开发,即 Windows、FreeBSD、OpenBSD、NetBSD 和 Solaris。它甚至被移植到 IBMz 系统大型机上。IBM 的 Bill O'Farrell 在丹佛的 GopherCon 2016 上做了一次演讲,题目是移植到 IBM z 架构https://www.youtube.com/watch?v=z0f4Wgi94eo )。

众所周知,谷歌使用 Python、java 和 C++。他们为什么选择这些语言也是可以理解的。他们每个人都有自己的优势和劣势。Go 是一种尝试,旨在创建一种适合谷歌需要的新语言。他们需要的软件能够在重负载下运行良好,支持并发性,并且易于读写和快速编译。

启动 GO 项目的触发事件是处理大量的 C++代码库,因为 C++处理依赖项并重新包含头文件,因此需要花费数小时来构建。https://www.youtube.com/watch?v=bj9T2c2Xk_s (37:15)。这就是为什么 Go 的主要目标之一是快速编译。GO 帮助编译时间为秒,因为它比 C++更有效地处理依赖关系。

关于 Go 2.0 的讨论已经开始,但仍处于概念阶段。没有发布的时间表,也没有急于发布新的主要版本。

收养与社区

Go仍然是一门年轻的语言,但它的使用率不断提高,受欢迎程度也不断提高。Go 是 2009 年和 2016 年 TIOBE 年度最佳语言:

资料来源:https://www.tiobe.com/tiobe-index/go/

One of the expectations expressed by the Go team was the anticipation that Go would draw a lot of C/C++ and Java developers, but they were surprised when a large number of the users came from scripting languages such as Python and Ruby. Others, like myself, found Go to be a natural complement to Python, a great language. However, which language do you go to when you need something much more powerful? Some large companies have demonstrated that Go is stable for large-scale production use, including Google, Dropbox, Netflix, Uber, and SoundCloud.

第一次Go会议于 2014 年举行,名为 GopherCon。从那时起,每年都会举办地鼠大会。在上阅读更多关于地鼠的信息 https://gophercon.com 。我有幸在 2016 年的 GopherCon 大会上就数据包捕获进行了演讲,并获得了丰富的经验(https://www.youtube.com/watch?v=APDnbmTKjgM )。

关于Go的常见批评

有一些批评在社区中反复出现。也许最臭名昭著、讨论最多的批评是缺乏泛型。这会导致重复代码来处理不同的数据类型。可以在一定程度上使用接口来缓解此问题。我们可能会在未来的版本中看到泛型,因为作者已经对泛型表现出开放性,但他们并没有匆忙做出重要的设计决策。

下一个经常听到的批评是缺乏例外。开发人员必须显式地处理或忽略每个错误。就我个人而言,我发现这是一个令人耳目一新的变化。这实际上并没有太多的工作,您可以完全控制代码流。有时,除了例外情况,你不确定它会在冒泡时被抓住。使用 Go,您可以轻松地遵循错误处理代码。

Go 有一个处理内存清理的垃圾收集器。随着时间的推移,垃圾收集器已经升级,并在不断改进。垃圾收集器对性能的影响很小,但却为开发人员节省了大量的思考和担忧。Go 最初被描述为一种系统编程语言,缺乏对内存的控制限制了非常低级的应用。从那时起,他们就不再称 Go 为系统编程语言。如果您需要对内存进行低级控制,则必须用 C 编写部分代码。

Go工具链

The go executable is the main application of the Go toolchain. You can pass a command to go, and it will take the appropriate action. The toolchain has tools to run, compile, format source code, download dependencies, and more. Let's look at the full list, which is obtained as an output from the go help command or just go by itself:

  • build:编译包和依赖项
  • clean:删除目标文件
  • doc:显示包装或符号的文档
  • env:打印 Go 环境信息
  • generate:这是代码生成器
  • fix:新版本发布时升级 Go 代码
  • fmt:在包源上运行gofmt
  • get:下载并安装软件包和依赖项
  • help: This provides more help on a specific topic
  • install:编译并安装包和依赖项
  • list:此列表列出了软件包
  • run:编译并运行 Go 程序
  • test:运行单元测试和基准测试
  • vet: This examines source code for bugs
  • version:显示 Go 版本

有关这些命令的更多信息,请访问https://golang.org/cmd/

Go吉祥物

每个人都知道最好的剑有名字,最好的编程语言有吉祥物。Go 的吉祥物是地鼠。地鼠没有名字。它有一个果冻豆状的身体,显微镜下的四肢,巨大的眼睛和两颗牙齿。它由 Renee French 设计,版权归知识共享署名 3.0许可。这意味着您可以使用这些图像,但无论它们在哪里使用,您都必须归功于它们的创建者 Renee French。

Renee French 在丹佛举行的 2016 年地鼠大会上发表了题为Go Gopher:性格研究的演讲,解释了地鼠是如何形成的,它采用的各种媒介和形式,以及在各种情况下绘制它的技巧(https://www.youtube.com/watch?v=4rw_B4yY69k )。

您可以在处生成自定义地鼠化身 https://gopherize.me/ 并在阅读更多关于 Go gopher 的信息 https://blog.golang.org/gopher

学习Go

如果你以前从未使用过 Go,不要害怕。它有一个温和的学习曲线,非常简单,只需一两天就能学会。最好的出发点是https://tour.golang.org/ 。这是Go编程语言的基本教程。如果你已经经历了旅行,那么你应该已经有了基础,使它通过这本书就好了。如果你正在阅读这本书,并且没有参加本次旅行,你可能会遇到一个你不熟悉的概念,这里没有解释。旅游是学习和练习的好地方。

因为在语言规范中只有 25 个保留关键字,所以它足够短,可以被“凡人”理解。您可以在上阅读更多关于规格的信息 https://golang.org/ref/spec

您必须已经熟悉这些关键字中的大多数。这些是:ifelsegotoforimportreturnvarcontinuebreakrangetypefuncinterfacepackageconstmapstructselectcaseswitchdeferchanfallthroughdefault

本教程将帮助您学习关键字、语法和数据结构的基础知识。教程中的操场允许您练习在浏览器中编写和运行代码。

为什么要用Go?

Go有几个方面吸引着我。并发性、速度和简单性对我来说是最重要的。这门语言非常简单易学。没有trycatch和异常流。虽然有人将繁琐的错误处理作为批评,但我发现,使用一种简单的语言,不隐藏很多幕后的魔力,并且完全按照它所说的去做,这是令人耳目一新的。go fmt工具标准化了格式,使得从其他人那里读取代码变得容易,并且消除了定义自己标准的负担。

Go 提供了一种可伸缩性和可靠性的感觉,实际上是一种令人愉快的体验。在 GO 之前,快速编译代码的主要选项是 C++,管理不同的平台的头文件和构建进程并不是简单的任务。多年来 C++已经成为一种非常复杂的语言,对于大多数人来说,它几乎不可接近。

为什么使用 Go 进行安全保护?

我想我们都明白,没有最好的编程语言,但不同的工作有不同的工具。Go 在性能和并发性方面表现出色。它的其他一些好处包括能够编译成单个可执行文件,并且可以轻松地进行交叉编译。它还有一个非常适合网络应用的现代标准库。

交叉编译的易用性使得安全领域中出现了一些有趣的用例。以下是安全性中交叉编译的几个用例:

  • 渗透测试人员可以使用 Raspberry Pi 为 Windows、macOS 和 Linux 编译自定义 Go reverse Shell,并尝试部署它们。
  • 网络防御者可以有一个中央数据库来存储从蜜罐服务器提供的所有蜜罐信息,然后交叉编译蜜罐服务器。这将使他们能够轻松地跨所有平台部署一致的应用,包括 Windows、mac 和 Linux。
  • 网络防御者可以在整个网络中以 Docker 容器的形式部署极其轻量级的蜜罐,其中包含一个静态链接的二进制文件。容器可以快速创建和销毁,使用最小的带宽和服务器资源。

当你问自己Go是否是一种好的语言选择时,将Go与其他一些顶级语言进行比较可能会有所帮助。

为什么不使用 Python 呢?

Python 是安全领域的一种流行语言。这很可能是因为它无处不在,学习曲线短,以及图书馆过多。现在已经有几种用 Python 编写的安全工具,即用于数据包捕获的 Scapy、用于 web 抓取的 Scrapy、用于调试的免疫性、用于解析 HTML 的漂亮汤,以及用于内存取证的 Volatility。许多供应商和服务提供商也提供 Python 中的 API 示例。

Python 很容易学习,并且有大量的资源。Go也很容易写,有一个温和的学习曲线。在我看来,学习曲线和编程的易用性并不是 Go 和 Python 之间的主要区别因素。这一最大的区别(也是 Python 的不足之处)是性能。Python 在性能方面无法与 Go 竞争。部分原因是 Python 的解释性质,但更大的因素是全局解释器锁GIL。GIL 防止解释器使用超过一个 CPU 的处理能力,即使有多个线程执行。有一些方法可以解决这个问题,例如使用多处理,但这有其自身的缺点和局限性,因为它实际上会产生一个新的过程。其他选项是使用 Jython(Java 上的 Python)或 IronPython(Python 上的.NET),这些选项没有 GIL。

为什么不使用 Java?

Java 最大的优势之一是能够编写一次,在任何地方WORA)运行。如果您必须执行任何涉及 GUI、图形或音频的操作,这将是非常有价值的。Go 在创建 GUI 的能力上当然没有打败 Java,但它是跨平台的,支持交叉编译。

Java 已经成熟并被广泛采用,拥有大量可用资源。Java 库的选项比 Go 包多。Java 是这两种语言中比较冗长的一种。Java 生态系统更为复杂,有几个构建工具和包管理器选项。Go更简单、更标准。这些差异可以简单地归因于两种语言之间的年龄差异,但它仍然可能影响你的语言选择。

在某些情况下,Java 虚拟机JVM)在内存或启动时间方面可能过于占用资源。如果需要通过管道将多个命令行 Java 应用连接在一起,JVM 运行一系列短期程序的启动时间可能会对性能造成重大影响。就内存而言,如果您需要运行同一应用的多个实例,那么运行每个 JVM 所需的内存可以相加。JVM 也可以进行限制,因为它会创建一个沙箱,并限制您对主机的访问。Go 编译为本机代码,因此不需要虚拟机层。

Go 有很好的文档记录,社区继续增长并提供更多资源。这是一种很容易学习的语言,特别是对于有经验的程序员来说。与库包相比,并发稍微简单一些,并且内置在语言中。

Why not use C++?

由于开发者负责内存管理,没有垃圾回收器,C++提供了更多的控制。出于同样的原因,C++的性能会稍微好一些。在某些情况下,GO 实际上可以胜过 C++。

C++是非常成熟的,并且有大量的第三方库。库并不总是跨平台的,可能有复杂的 makefile。Go 中的交叉编译要简单得多,可以使用 Go 工具链来完成。

Go 编译效率更高,因为它具有更好的依赖关系管理。C++可以多次重新包含相同的头文件,并导致编译时间膨胀。在 Go 中,包装系统更加一致和标准化。线程和并发是本地的 GO,并且需要 C++中的平台特定库。

C++的成熟也导致语言的不断增长,并随着时间的推移变得越来越复杂。Go是一种令人耳目一新的变化,它使用了一种简单而现代的语言。对初学者来说,C++并不像初学者那么友好。

开发环境

本书中的所有示例都将在主要平台、Windows、macOS 和 Linux 上运行。话虽如此,这些示例主要是在 Ubuntu Linux 上编写和开发的,下面的示例推荐使用这个平台。

Ubuntu Linux 在免费提供 https://www.ubuntu.com/download/desktop 。下载页面可能要求捐款,但您可以选择免费下载。Ubuntu 不是必需的,但是如果你有相同的环境,这本书会更容易理解。其他 Linux 发行版也应该工作得很好,但我强烈建议您使用基于 Debian 的发行版。本书中的大多数 Go 代码示例都可以在 Windows、Linux 和 Mac 上运行,无需任何修改。某些示例可能是特定于 Linux 和 Mac 的,例如文件权限,在 Windows 中不作类似处理。提到了特定于平台的任何示例。

您可以在虚拟机中免费安装 Ubuntu,也可以将其作为主操作系统安装。只要您的系统有足够的 CPU、RAM 和磁盘空间,我建议您使用带有 Oracle VirtualBox 的虚拟机,该虚拟机可在上找到 https://www.virtualbox.org/ 。VMWare Player 是 VirtualBox 的替代产品,可在上购买 https://www.vmware.com/products/player/playerpro-evaluation.html

下载并安装 VirtualBox,然后下载 Ubuntu 桌面 ISO 文件。创建一个虚拟机,让它启动 Ubuntu ISO,然后选择安装选项。一旦你安装了 Ubuntu 并以用户身份登录,你就可以安装 Go 编程语言了。Ubuntu 通过提供一个软件包使这一过程变得非常简单。只需打开终端窗口并运行以下命令:

sudo apt-get install golang-go

使用sudo会提升您的安装权限,并可能要求您输入密码。如果一切顺利,您现在可以访问包含整个工具链的go可执行文件。您可以自行运行go helpgo获取使用说明。

If you are not using Ubuntu or want to install the latest version, you can download the latest version from https://golang.org/dl. The Windows and Mac installer will take care of updating your PATH environment variable, but in Linux you will have to move the extracted contents to a desired location, such as /opt/go, and then update your PATH environment variable manually to include the location. Consider this example:

# Extract the downloaded Go tar.gz
tar xzf go1.9.linux-amd64.tar.gz
# Move the extracted directory to /opt
sudo mv go /opt
# Update PATH environment variable to include Go's binaries
echo "export PATH=$PATH:/opt/go/bin" >> ~/.bashrc

现在重新启动终端,使更改生效。如果您使用的是 Bash 以外的 shell,则需要为 shell 更新适当的 RC 文件。

Installing Go on other platforms

如果您不使用 Ubuntu,您仍然可以轻松安装 Go。Go 网站在的下载页面提供多种安装格式 https://golang.org/dl/

其他 Linux 发行版

第一个选项是使用 Linux 发行版的包管理器安装 Go。大多数主要发行版都有一个 Go 包。名称各不相同,因此可能需要进行 web 搜索以获得确切的包名。如果没有可用的包,只需下载预编译的 Linux tarball 并将其解压缩即可。提取内容的好地方是/opt/go。然后,将/opt/go/bin添加到PATH环境变量中,方法与上一节中所述相同。

窗户

有一个官方的 Windows 安装程序可用,这使得安装与运行安装程序一样简单。您可能需要修改环境变量并更新您的%PATH%变量。在 Windows 10 中,可以通过导航到控制面板|系统|高级系统设置|环境变量来找到这一点。

雨衣

官方安装程序也可用于 Mac。运行安装程序后,Go 将在您的PATH变量中可用。

设置Go

此时,您的环境应该已经安装,并且您应该能够从终端窗口运行go可执行文件。go 程序是访问 go 工具链的方式。可以通过运行以下命令对其进行测试:

go help

现在,我们准备编写第一个 Hello World 程序,以确保我们的环境完全正常运行。在开始编码之前,我们需要创建一个合适的工作空间。

创建您的工作区

Go 具有用于工作区的标准文件夹结构。要使 Go 工具链正常工作,必须遵守某些标准。您可以在任意位置创建工作区目录,并可以随意命名。对于实验室环境,我们将简单地使用Home目录作为 Go 工作区。这意味着源文件将驻留在~/src中,包将内置在~/pkg中,可执行文件将安装在~/bin中。

设置环境变量

为了使大多数 Go 工具链正常工作,必须设置GOPATH环境变量。GOPATH指定您将哪个目录视为工作区。必须先设置GOPATH环境变量,然后才能生成包。有关更多帮助和信息,请通过运行以下命令在终端中调用go help命令:

go help gopath

我们需要告诉 Go 将我们的home目录作为工作区。这是通过设置GOPATH环境变量来完成的。您可以通过三种方式设置GOPATH

  • 第一种方法是每次运行go命令时手动设置。考虑这个例子:
 GOPATH=$HOME go build hello
  • 您还可以设置GOPATH变量,使其保持设置状态,直到您关闭终端且环境变量丢失:
 export GOPATH=$HOME
  • 第三个选项是永久设置GOPATH环境变量,如下所示:
 echo "export GOPATH=$HOME" >> $HOME/.bashrc

请注意,Go 版本 1.8 及更高版本不需要显式设置GOPATH环境变量。如果没有设置GOPATH,它将使用$HOME/go作为默认工作区。

编辑

We're about to write our first program in our new hello directory. You will first need to choose which editor to use. Fortunately, working with Go does not require any special IDE or editor. The Go toolchain integrates easily into many editors and IDEs. Your options range from using a simple text editor, such as Notepad, to full-fledged IDEs dedicated to Go.

我建议您从一个简单的文本编辑器开始,比如 nano 或 gedit,因为它们都包含在 Ubuntu 中,易于使用,并且支持开箱即用的语法突出显示。不过,您可以随意选择其他编辑器或 IDE。

许多文本编辑器和 IDE 都有插件来添加 Go 支持。例如,VisualStudioCode、Emacs、Sublime Text、JetBrains IntelliJ、Vim、Atom、NetBeans 和 Eclipse 都有 Go 插件。有两个 Go 专用 IDE,即 JetBrains GoLand 和 LiteIDE,它们都是跨平台的。

nanogedit命令开始,在熟悉 Go 之后,探索其他编辑器和 IDE。本书不会比较编辑器或介绍如何配置它们。

创建第一个包

~/src目录中,您创建的任何目录都是一个包。目录的名称将成为包或应用的名称。我们需要首先确保src目录存在。Tilde(~是主目录的快捷方式,类似于$HOME变量。请参阅以下代码块:

mkdir ~/src

让我们为我们的第一个应用创建一个名为hello的新包:

cd ~/src
mkdir hello

包只是一个目录。包中可以有一个或多个源文件。任何子目录都被视为单独的包。包可以是具有main()函数(package main的应用,也可以是只能导入到其他包的库。这个包还没有任何文件,但我们将在稍后编写第一个文件。现在不要太担心包的结构。您可以在上阅读有关包路径的更多信息 https://golang.org/doc/code.html#PackagePaths

编写第一个程序

您可以拥有的最简单的包是目录中的单个文件。创建一个新文件~/src/hello/hello.go,并将以下代码放入其中:

package main

import "fmt"

func main() {
   fmt.Println("Hello, world.")
}

运行可执行文件

执行程序最简单的方法是使用go run命令。以下命令将在不留下可执行文件的情况下运行该文件:

go run ~/src/hello/hello.go

构建可执行文件

要编译和构建可执行文件,请使用go build命令。当运行go build时,必须传递一个包的路径。您提供的包路径是相对于$GOPATH/src的。由于我们的包在~/src/hello中,我们将按如下方式运行命令:

go build hello

实际上,只要我们有一套$GOPATH设备,我们就可以在任何地方呼叫go build。创建的可执行二进制文件将输出到当前工作目录中。然后可以使用以下命令运行它:

./hello

安装可执行文件

go build工具很适合在当前工作目录中生成可执行文件,但有一种方法可以构建和安装应用,以便将所有可执行文件收集到同一位置。

当您运行go install时,它会将输出文件置于默认位置$GOPATH/bin。在我们的例子中,我们将$GOPATH设置为等于我们的$HOME。所以默认的bin目录是$HOME/bin

如果您希望将GOBIN环境变量安装到其他地方,则可以通过设置该位置来覆盖该位置。要安装我们的hello程序,我们将运行以下命令:

go install hello

这将生成并创建一个可执行文件~/bin/hello。如果bin目录不存在,将自动创建该目录。如果多次运行install命令,它将重建并覆盖bin目录中的可执行文件。然后,应用可以通过以下方式运行:

~/bin/hello

为方便起见,您可以将~/bin添加到PATH环境变量中。这样做将允许您从任何工作目录运行应用。要将bin目录添加到您的PATH,请在终端中运行以下命令:

echo "export PATH=$PATH:$HOME/gospace/bin" >> ~/.bashrc

确保在此之后重新启动终端以刷新环境变量。之后,只需在终端中键入以下内容即可运行hello应用:

hello

安装应用是完全可选的。您不必安装程序来运行或构建它们。在开发时,您始终可以从当前的工作目录构建和运行,但安装已使用的已完成应用会很方便。

用 go-fmt 格式化

go fmt命令用于格式化源代码文件,以满足 Go 格式化标准。

这将确保缩进是准确的,没有多余的空格,等等。您可以一次格式化一个 Go 源代码文件或一个完整的包。遵循 Go 编码标准并在您的文件上运行go fmt是一种很好的做法,这样您就可以毫不怀疑您的代码遵循了指导原则。阅读中有关格式的更多信息 https://golang.org/doc/effective_go.html#formatting

运行Go示例

本书中提供的示例都是独立的。每个示例都是完整的程序,可以运行。大多数示例都很简短,并演示了一个特定主题。虽然这些示例可以作为独立程序使用,但其中一些可能用途有限。它们旨在作为参考,并像烹饪书一样用于构建您自己的项目。因为每个示例都是一个自包含的主包,所以可以使用go build命令获取可执行文件,并使用go run运行该文件。下面是有关构建和运行程序的各种选项的更多详细信息。

Building a single Go file

如果您构建一个文件,它将生成一个以 Go 文件命名的可执行文件。运行以下命令:

go build example.go

This will give you an executable named example that could be executed like this:

./example

运行单个 Go 文件

如果只想运行它,就不必构建文件并获取可执行文件。go run选项允许您在不留下可执行文件的情况下运行.go文件。您仍然可以像传递常规可执行文件一样传递参数,如下所示:

go run example.go arg1 arg2

构建多个 Go 文件

If a program is split into multiple files, you can pass all of them to the build command. For example, if you have a main.go file and an utility.go file containing extra functions, you could build them by running the following command:

go build main.go utility.go

如果您试图自行构建main.go,它将无法找到utility.go中函数的引用。

生成文件夹(包)

如果一个包包含多个需要构建的 Go 文件,那么将每个文件传递给build命令是非常繁琐的。如果在文件夹中没有参数的情况下运行go build,它将尝试构建目录中的所有.go文件。如果其中一个文件的顶部包含一个package main语句,它将生成一个以目录名命名的可执行文件。如果您编写一个程序,则可以编写一个不包含主文件的包,该包仅用作要包含在其他项目中的库。

安装程序以供使用

安装一个程序与构建一个程序类似,但不是运行go build,而是运行go install。您可以在目录中运行它,向它传递一个绝对目录路径,并向它传递一个相对于$GOPATH环境变量的目录路径,或者直接在文件上传递。一旦安装了一个程序,它就会进入你的$GOBIN,你应该已经设置好了。您应该已经在您的$PATH中添加了$GOBIN,这样您就可以直接从命令行运行已安装的程序,而不管您当前所在的目录是什么。安装是完全可选的,但对于某些程序,尤其是那些您想要保存或经常使用的程序,安装是很方便的。

总结

阅读本章后,您应该对 Go 编程语言及其一些关键特性有一个大致的了解。您还应该在计算机上安装 Go 版本,并设置环境变量。如果您需要有关安装和测试环境的更多说明,请参阅位于的 Go 文档 https://golang.org/doc/install

在下一章中,我们将更深入地了解 Go 编程语言,了解设计、数据类型、关键字、功能、控制结构,以及从何处获得帮助和查找文档。如果你已经熟悉Go,这应该是一个很好的复习,以加强你的基础知识。如果你是新手,这本书将作为你准备本书其余部分的入门书。