从源代码安装 Go

本主题描述如何从源代码构建并运行 Go。如需使用安装程序进行安装,请参阅下载并安装

引言

Go 是一个开源项目,在 BSD 风格许可证下分发。本文档解释了如何检出源代码、在您自己的机器上构建并运行它们。

大多数用户不需要这样做,他们将按照下载并安装中所述,通过预编译的二进制包安装,这是一个更简单的过程。然而,如果您想帮助开发这些预编译包中的内容,请继续阅读。

Go 有两个官方编译器工具链。本文档重点介绍 gc Go 编译器和工具。关于如何使用 gccgo(一个使用 GCC 后端的更传统编译器)的信息,请参阅设置和使用 gccgo

Go 编译器支持以下指令集

amd64, 386
x86 指令集,64 位和 32 位。
arm64, arm
ARM 指令集,64 位 (AArch64) 和 32 位。
loong64
64 位 LoongArch 指令集。
mips64, mips64le, mips, mipsle
MIPS 指令集,大端和小端,64 位和 32 位。
ppc64, ppc64le
64 位 PowerPC 指令集,大端和小端。
riscv64
64 位 RISC-V 指令集。
s390x
IBM z/Architecture。
wasm
WebAssembly.

编译器可以面向 AIX、Android、DragonFly BSD、FreeBSD、Illumos、Linux、macOS/iOS (Darwin)、NetBSD、OpenBSD、Plan 9、Solaris 和 Windows 操作系统(尽管并非所有操作系统都支持所有架构)。

被视为“一流”的移植列表可在 一流移植 wiki 页面上找到。

支持的完整组合列表在下面关于环境变量的讨论中列出。

有关整体系统要求,请参阅 Go Wiki MinimumRequirements 页面。

安装用于引导的 Go 编译器二进制文件

Go 工具链是用 Go 编写的。要构建它,您需要安装 Go 编译器。执行工具初始构建的脚本会在 $PATH 中查找“go”命令,因此只要您的系统已安装 Go 并在 $PATH 中配置好,您就可以从源代码构建 Go。或者,如果您愿意,可以将 $GOROOT_BOOTSTRAP 设置为 Go 安装的根目录,以便用于构建新的 Go 工具链;$GOROOT_BOOTSTRAP/bin/go 应为您要使用的 go 命令。

所需的最低 Go 版本取决于目标 Go 版本

有四种可能的方法获取引导工具链

这些方法详情如下。

从二进制版本引导工具链

要使用二进制版本作为引导工具链,请参阅下载页面或使用任何满足最低版本要求的其他打包 Go 分发版。

从交叉编译的源代码引导工具链

要从源代码交叉编译引导工具链,这对于 Go 1.4 未支持的系统(例如 linux/ppc64le)是必需的,请在不同的系统上安装 Go 并运行 bootstrap.bash

运行时(例如)

$ GOOS=linux GOARCH=ppc64 ./bootstrap.bash

bootstrap.bash 会为该 GOOS/GOARCH 组合交叉编译一个工具链,将生成的目录树留在 ../../go-${GOOS}-${GOARCH}-bootstrap 中。可以将该目录树复制到给定目标类型的机器上,并用作 GOROOT_BOOTSTRAP 来引导本地构建。

使用 gccgo 引导工具链

要使用 gccgo 作为引导工具链,您需要确保 $GOROOT_BOOTSTRAP/bin/go 是 gccgo 5 自带的 go 工具。例如在 Ubuntu Vivid 上

$ sudo apt-get install gccgo-5
$ sudo update-alternatives --set go /usr/bin/go-5
$ GOROOT_BOOTSTRAP=/usr ./make.bash

从 C 源代码引导工具链

要从 C 源代码构建引导工具链,请使用 git 分支 release-branch.go1.4go1.4-bootstrap-20171003.tar.gz,其中包含 Go 1.4 源代码以及累积的修补程序,以使工具在新操作系统上运行。(Go 1.4 是工具链用 C 编写的最后一个版本。)解压 Go 1.4 源代码后,cdsrc 子目录,在环境中设置 CGO_ENABLED=0,然后运行 make.bash(或者在 Windows 上运行 make.bat)。

一旦 Go 1.4 源代码被解压到您的 GOROOT_BOOTSTRAP 目录中,您必须将此 git 克隆实例保持在 release-branch.go1.4 分支上。特别是,不要尝试在稍后名为“获取仓库”的步骤中重用此 git 克隆。go1.4 引导工具链必须能够正确遍历它假定存在于此仓库根目录下的 go1.4 源代码。

请注意,Go 1.4 并非在所有支持后续 Go 版本的系统上都能运行。特别是,Go 1.4 不支持当前版本的 macOS。在此类系统上,必须使用其他方法之一获取引导工具链。

安装 Git(如果需要)

要执行下一步,您必须安装 Git。(继续之前请检查您是否有 git 命令。)

如果您没有可用的 Git 安装,请按照 Git 下载页面上的说明进行操作。

(可选)安装 C 编译器

要构建支持 cgo 的 Go 安装(允许 Go 程序导入 C 库),必须首先安装一个 C 编译器,例如 gccclang。请使用系统上的标准安装方法进行安装。

要在没有 cgo 的情况下构建,请在运行 all.bashmake.bash 之前设置环境变量 CGO_ENABLED=0

获取仓库

切换到您打算安装 Go 的目录,并确保 goroot 目录不存在。然后克隆仓库并检出最新的发布标签或发布分支(例如 go1.22.0release-branch.go1.22

$ git clone https://go.googlesource.com/go goroot
$ cd goroot
$ git checkout <tag>

其中 <tag> 是版本的版本字符串。

Go 将安装在检出到的目录中。例如,如果 Go 检出到 $HOME/goroot 中,则可执行文件将安装在 $HOME/goroot/bin 中。该目录可以有任何名称,但请注意,如果 Go 检出到 $HOME/go 中,它将与 $GOPATH 的默认位置冲突。请参阅下面关于GOPATH 的内容。

提醒:如果您选择从源代码编译引导二进制文件(在前面的章节中),您此时仍需要再次进行 git clone(以检出最新的 <tag>),因为您必须将 go1.4 仓库与当前仓库分开。

如果您打算修改 Go 源代码,并向项目贡献您的更改,那么请将您的仓库从发布标签移开,并切换到 master(开发)分支。否则,请跳过此步骤。

$ git checkout master

安装 Go

要构建 Go 分发版,请运行

$ cd src
$ ./all.bash

(要在 Windows 下构建,请使用 all.bat。)

如果一切顺利,它将打印如下输出结束

ALL TESTS PASSED

---
Installed Go for linux/amd64 in /home/you/go.
Installed commands in /home/you/go/bin.
*** You need to add /home/you/go/bin to your $PATH. ***

最后几行的详细信息反映了安装过程中使用的操作系统、架构和根目录。

有关控制构建方法的更多信息,请参阅下面关于环境变量的讨论。all.bash(或 all.bat)会运行 Go 的重要测试,这可能比简单构建 Go 花费更多时间。如果您不想运行测试套件,请改用 make.bash(或 make.bat)。

测试您的安装

通过构建一个简单程序来检查 Go 是否正确安装。

创建一个名为 hello.go 的文件,并将以下程序放入其中

package main

import "fmt"

func main() {
	fmt.Printf("hello, world\n")
}

然后使用 go 工具运行它

$ go run hello.go
hello, world

如果您看到“hello, world”消息,则表示 Go 已正确安装。

设置您的工作环境

您几乎完成了。只需再进行一些设置。

如何编写 Go 代码 了解如何设置和使用 Go 工具

如何编写 Go 代码文档提供了使用 Go 工具的基本设置说明

安装其他工具

一些 Go 工具(包括 gopls)的源代码保存在 golang.org/x/tools 仓库中。要安装其中一个工具(此处以 gopls 为例)

$ go install golang.org/x/tools/gopls@latest

社区资源

帮助页面上列出的常规社区资源拥有活跃的开发者,他们可以帮助您解决安装或开发工作中的问题。对于希望及时了解最新动态的人,还有一个邮件列表 golang-checkins,该列表接收总结 Go 仓库中每次签入的邮件。

可以使用 Go 问题跟踪器报告错误。

及时了解发布版本

新版本会在 golang-announce 邮件列表上宣布。每个公告都会提及最新的发布标签,例如 go1.9

要将现有目录树更新到最新版本,可以运行

$ cd go/src
$ git fetch
$ git checkout <tag>
$ ./all.bash

其中 <tag> 是版本的版本字符串。

可选环境变量

Go 编译环境可以通过环境变量进行定制。构建过程不要求设置任何变量,但您可能希望设置一些变量来覆盖默认值。

请注意,$GOARCH$GOOS 标识的是目标环境,而不是您正在运行的环境。实际上,您总是在进行交叉编译。架构是指目标环境可以运行的二进制文件类型:运行 32 位操作系统的 x86-64 系统必须将 GOARCH 设置为 386,而不是 amd64

如果您选择覆盖默认值,请在 shell 配置文件($HOME/.bashrc$HOME/.profile 或等效文件)中设置这些变量。设置可能如下所示

export GOARCH=amd64
export GOOS=linux

尽管如此,再次强调,构建、安装和开发 Go 目录树不需要设置这些变量中的任何一个。