从源代码安装 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 操作系统(尽管并非所有操作系统都支持所有架构)。
“一流”端口的列表可在一流端口维基页面上找到。
所有受支持的组合列表在下面的环境变量讨论中列出。
有关整体系统要求,请参阅 Go Wiki MinimumRequirements 页面。
安装 Go 编译器二进制文件用于引导
Go 工具链是用 Go 编写的。要构建它,您需要安装 Go 编译器。执行工具初始构建的脚本会在 $PATH 中查找“go”命令,因此只要您在系统上安装了 Go 并将其配置到 $PATH 中,您就可以从源代码构建 Go。或者,如果您愿意,可以将 $GOROOT_BOOTSTRAP 设置为 Go 安装的根目录,以用于构建新的 Go 工具链;$GOROOT_BOOTSTRAP/bin/go 应该是要使用的 go 命令。
所需的 Go 最低版本取决于目标 Go 版本
- Go <= 1.4:C 工具链。
- 1.5 <= Go <= 1.19:Go 1.4 编译器。
- 1.20 <= Go <= 1.21:Go 1.17 编译器。
- 1.22 <= Go <= 1.23:Go 1.20 编译器。
- 未来,Go 版本 1.N 将需要 Go 1.M 编译器,其中 M 是 N-2 并向下舍入为偶数。示例:Go 1.24 和 1.25 需要 Go 1.22。
有四种可能的方法来获取引导工具链
- 下载 Go 的最新二进制版本。
- 使用具有工作 Go 安装的系统交叉编译工具链。
- 使用 gccgo。
- 从 Go 1.4 编译工具链,这是最后一个带有 C 编写编译器的 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.4 或 go1.4-bootstrap-20171003.tar.gz,其中包含 Go 1.4 源代码以及累积的修复,以使工具在新操作系统上运行。(Go 1.4 是工具链以 C 编写的最后一个发行版。)解压 Go 1.4 源代码后,cd 到 src 子目录,在环境中设置 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 编译器,例如 gcc 或 clang。使用系统上标准的任何安装方法进行安装。
要不带 cgo 构建,请在运行 all.bash 或 make.bash 之前设置环境变量 CGO_ENABLED=0。
获取仓库
切换到您打算安装 Go 的目录,并确保 goroot 目录不存在。然后克隆仓库并检出最新的发布标签或发布分支(例如 go1.22.0 或 release-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 仓库独立。
(可选)切换到 master 分支
如果您打算修改 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 工具(包括 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 编译环境可以通过环境变量进行自定义。构建不需要任何变量,但您可能希望设置一些变量来覆盖默认值。
$GOROOTGo 树的根目录,通常是
$HOME/go1.X。它的值在编译时内置到树中,默认为运行all.bash的目录的父目录。除非您想在多个本地仓库副本之间切换,否则无需设置此变量。$GOROOT_FINAL当未明确设置
$GOROOT时,安装的二进制文件和脚本假定的值。它默认为$GOROOT的值。如果您想在一个位置构建 Go 树,但在构建后将其移动到其他位置,请将$GOROOT_FINAL设置为最终位置。$GOPATHGo 发行版之外的 Go 项目通常检出的目录。例如,
golang.org/x/tools可能会检出到$GOPATH/src/golang.org/x/tools。Go 发行版之外的可执行文件安装在$GOPATH/bin中(如果设置了$GOBIN,则安装在$GOBIN中)。模块下载并缓存到$GOPATH/pkg/mod中。$GOPATH的默认位置是$HOME/go,通常不需要明确设置GOPATH。但是,如果您已将 Go 发行版检出到$HOME/go,则必须将GOPATH设置为其他位置以避免冲突。$GOBIN使用 go 命令安装 Go 发行版之外的可执行文件的目录。例如,
go install golang.org/x/tools/gopls@latest会下载、构建并安装$GOBIN/gopls。默认情况下,$GOBIN是$GOPATH/bin(如果未设置GOPATH,则为$HOME/go/bin)。安装后,您需要将此目录添加到您的$PATH中,以便可以使用已安装的工具。请注意,Go 发行版的可执行文件安装在
$GOROOT/bin(供人们调用的可执行文件)或$GOTOOLDIR(供 go 命令调用的可执行文件;默认为$GOROOT/pkg/$GOOS_$GOARCH)而不是$GOBIN中。$GOOS和$GOARCH目标操作系统和编译架构的名称。它们分别默认为
$GOHOSTOS和$GOHOSTARCH的值(如下所述)。$GOOS的选择包括android、darwin、dragonfly、freebsd、illumos、ios、js、linux、netbsd、openbsd、plan9、solaris、wasip1和windows。$GOARCH的选择包括amd64(64 位 x86,最成熟的移植)、386(32 位 x86)、arm(32 位 ARM)、arm64(64 位 ARM)、ppc64le(PowerPC 64 位,小端)、ppc64(PowerPC 64 位,大端)、mips64le(MIPS 64 位,小端)、mips64(MIPS 64 位,大端)、mipsle(MIPS 32 位,小端)、mips(MIPS 32 位,大端)、s390x(IBM System z 64 位,大端)和wasm(WebAssembly 32 位)。$GOOS和$GOARCH的有效组合是$GOOS$GOARCHaixppc64android386androidamd64androidarmandroidarm64darwinamd64darwinarm64dragonflyamd64freebsd386freebsdamd64freebsdarmillumosamd64iosarm64jswasmlinux386linuxamd64linuxarmlinuxarm64linuxloong64linuxmipslinuxmipslelinuxmips64linuxmips64lelinuxppc64linuxppc64lelinuxriscv64linuxs390xnetbsd386netbsdamd64netbsdarmopenbsd386openbsdamd64openbsdarmopenbsdarm64plan9386plan9amd64plan9armsolarisamd64wasip1wasmwindows386windowsamd64windowsarmwindowsarm64$GOHOSTOS和$GOHOSTARCH主机操作系统和编译架构的名称。它们默认为本地系统的操作系统和架构。
有效选择与上述
$GOOS和$GOARCH相同。指定的值必须与本地系统兼容。例如,您不应该在 x86 系统上将$GOHOSTARCH设置为arm。$GO386(仅适用于386,默认为sse2)此变量控制 gc 如何实现浮点计算。
GO386=softfloat:使用软件浮点操作;应支持所有 x86 芯片(Pentium MMX 或更高版本)。GO386=sse2:使用 SSE2 进行浮点运算;性能更好,但仅适用于 Pentium 4/Opteron/Athlon 64 或更高版本。
$GOARM(仅适用于arm;如果在目标处理器上构建,则默认自动检测,否则为 7)这设置了运行时应针对的 ARM 浮点协处理器架构版本。如果您正在目标系统上编译,其值将自动检测。
GOARM=5:使用软件浮点;当 CPU 没有 VFP 协处理器时GOARM=6:仅使用 VFPv1;交叉编译时的默认值;通常是 ARM11 或更好的核心(也支持 VFPv2 或更好)GOARM=7:使用 VFPv3;通常是 Cortex-A 核心
如有疑问,请将此变量保持未设置状态,并在首次运行 Go 可执行文件时根据需要进行调整。Go 社区 wiki 上的 GoARM 页面包含有关 Go ARM 支持的更多详细信息。
$GOAMD64(仅适用于amd64;默认为v1)这设置了编译的微架构级别。有效值为
v1(默认)、v2、v3、v4。有关更多信息,请参阅Go Wiki MinimumRequirements 页面。$GOMIPS(仅适用于mips和mipsle)
$GOMIPS64(仅适用于mips64和mips64le)这些变量设置是否使用浮点指令。设置为“
hardfloat”以使用浮点指令;这是默认值。设置为“softfloat”以使用软浮点。$GOPPC64(仅适用于ppc64和ppc64le)此变量设置编译器将针对的处理器级别(即指令集架构版本)。默认值为
power8。GOPPC64=power8:生成 ISA v2.07 指令GOPPC64=power9:生成 ISA v3.00 指令
$GORISCV64(仅适用于riscv64)此变量设置编译的 RISC-V 用户模式应用配置文件。默认值为
rva20u64。$GOWASM(仅适用于wasm)此变量是一个逗号分隔的实验性 WebAssembly 功能列表,编译后的 WebAssembly 二进制文件允许使用这些功能。默认情况下不使用任何实验性功能。
GOWASM=satconv:生成饱和(非陷阱)浮点到整数转换GOWASM=signext:生成符号扩展运算符
请注意,$GOARCH 和 $GOOS 标识的是目标环境,而不是您正在运行的环境。实际上,您始终在进行交叉编译。通过架构,我们指的是目标环境可以运行的二进制文件的种类:运行 32 位操作系统的 x86-64 系统必须将 GOARCH 设置为 386,而不是 amd64。
如果您选择覆盖默认值,请在您的 shell 配置文件($HOME/.bashrc、$HOME/.profile 或等效文件)中设置这些变量。设置可能看起来像这样
export GOARCH=amd64 export GOOS=linux
尽管,再次重申,构建、安装和开发 Go 树不需要设置这些变量中的任何一个。