# Go官方工具链

目前，Go官方工具链中提供的工具是使用得最广泛的Go开发工具。 《Go语言101》所有中所有的实例代码都使用Go官方工具链中提供的标准编译器编译验证过。

本文将介绍如何配置Go开发环境和如何使用Go官方工具链中提供的`go`命令。 一些非官方工具链中的工具也将简单提及。

### 安装Go官方工具链

请从国际官网或者国内官网下载Go官方工具链， 并按照下载页面中的说明安装Go官方工具链。

我们也可以使用工具GoTV来安装多个Go官方工具链版本，并方便和谐地使用它们。

Go官方工具链的版本和其所支持的最高Go语言版本是一致的。 比如，Go官方工具链1.23.x版本支持从1.0到1.23的所有Go语言版本。

为了从任意目录运行Go官方工具链中工具命令（通过`go`命令）， Go官方工具链安装目录下的`bin`子目录路径必须配置在`PATH`环境变量中。 当使用安装程序安装Go官方工具链时，安装程序很可能已经自动地将此配置好了。

Go官方工具链近来的版本均支持一个称为Go模块（Go modules）的特性，用来管理项目依赖。 此特性在版本1.11中被试验性地引入并从版本1.16开始被默认支持。

我们应该了解一个环境变量：`GOPATH`。 此环境变量的默认值为当前用户的HOME目录下的名为`go`文件夹对应的目录路径。 `GOPATH`环境变量可以被手动地配置多个路径。 以后，当`GOPATH`文件夹被提及的时候，它表示`GOPATH`环境变量中的第一个路径对应的文件夹。

- `GOPATH`文件夹中的`pkg`子文件夹用来缓存被本地项目所依赖的Go模块（一个Go模块为若干Go库包的集合）的版本。
- `GOBIN`环境变量用来指定`go install`子命令产生的Go应用程序二进制可执行文件应该存储在何处。 它的默认值为`GOPATH`文件夹中的`bin`子目录所对应的目录路径。 `GOBIN`路径需配置在`PATH`环境变量中，以便从任意目录运行这些Go应用程序。

### 最简单的Go程序

让我们写一个简单的Go程序，并且学习如何运行之。

下面的程序应该是最简单的Go程序。

    package main

    func main() {
    }

在此程序中，单词`package`和`func`是两个关键字。 两个`main`是两个标识符。 标识符和关键字将在后续的一篇文章中讲解。

此程序的第一行指定了当前源代码文件所处的包的包名（此处为`main`）。 第二行是一个空行，用来增强可读性。 第三和第四行声明了一个名为`main`的函数。 此函数为程序的入口函数。

### 运行一个Go程序

Go官方工具链工具要求所有的Go源代码文件必须以`.go`后缀结尾。 这里，我们假设上面展示的最简单的Go程序存放在一个名叫`simplest-go-program.go`的文件中。

打开一个终端（控制台）并进入上述源文件所在的目录，然后运行

    $ go run simplest-go-program.go

什么也没输出？是的，此程序不做什么有实质意义的事儿。

如果代码中有语法错误，这些错误将输出在终端中。

如果一个程序的`main`包中有若干Go源代码文件，我们也可以使用下面的命令运行此程序。

    $ go run .

注意：

- `go run`子命令并不推荐在正式的大项目中使用。`go run`子命令只是一种方便的方式来运行简单的Go程序。 对于正式的项目，最好使用`go build`或者`go install`子命令构建可执行程序文件来运行Go程序。
- 支持Go模块特性的Go项目的根目录下需要一个`go.mod`文件。此文件可以使用`go mod init`子命令来生成（见下）。
- 名称以`_`和`.`开头的源代码文件将被Go官方工具链工具忽略掉。

### 更多`go`子命令

上面提到的三个`go`子命令（`go run`、`go build`和`go install`） 将只会输出代码语法错误。它们不会输出可能的代码逻辑错误（即警告）。 `go vet`子命令可以用来检查可能的代码逻辑错误（即警告）。

我们可以（并且应该常常）使用`go fmt`子命令来用同一种代码风格格式化Go代码。

我们可以使用`go test`子命令来运行单元和基准测试用例。

我们可以使用`go doc`子命令来（在终端中）查看Go代码库包的文档。

强烈推荐让你的Go项目支持Go模块特性来简化依赖管理。对一个支持Go模块特性的项目：

- `go mod init example.com/myproject`命令可以用来在当前目录中生成一个`go.mod`文件。 当前目录将被视为一个名为`example.com/myproject`的模块（即当前项目）的根目录。 此`go.mod`文件将被用来记录当前项目需要的依赖模块和版本信息。 我们可以手动编辑或者使用`go`子命令来修改此文件。
- `go mod tidy`命令用来通过扫描当前项目中的所有代码来添加未被记录的依赖至`go.mod`文件或从`go.mod`文件中删除不再被使用的依赖。
- `go get`命令用拉添加、升级、降级或者删除单个依赖。此命令不如`go mod tidy`命令常用。

从Go官方工具链1.16版本开始，我们可以运行`go install example.com/program@latest`来安装一个第三方Go程序的最新版本（至`GOBIN`目录）。 在Go官方工具链1.16版本之前，对应的命令是`go get -u example.com/program`（现在已经被废弃而不再推荐被使用了）。

我们可以运行`go help aSubCommand`来查看一个子命令`aSubCommand`的帮助信息。

运行不带参数的`go`命令将会列出所有支持的`go`子命令。

《Go语言101》系列文章将不再对各种`go`子命令做更多的解释。 请阅读官方文档 （墙外版）以获取更多信息。

### 查看Go代码库文档

我们可以使用Go项目文档和代码阅读工具Golds（`go101.org/golds`，由本书作者老貘开发）来阅读代码库文档。 此工具将列出类型的实现关系，并且支持良好的代码阅读体验。 安装Golds完成之后，我们可以运行`golds std ./...`来阅读Go标准库和当前文件夹下的所有库包的文档。

我们可以在国内官网或者国际官网阅读Go官方文档。