从源代码安装 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 <= 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
的 Go 安装程序,请在运行 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 存储库保持独立。
(可选)切换到主分支
如果您打算修改 go 源代码,并 贡献您的更改 到该项目,那么请将您的存储库从发行版标签移动到主分支(开发分支)。否则,请跳过此步骤。
$ 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 编译环境。构建不需要任何环境变量,但你可能希望设置一些环境变量来覆盖默认值。
$GOROOT
Go 树的根目录,通常是
$HOME/go1.X
。它的值在编译树时内置,默认值为all.bash
运行的目录的父目录。除非你想要在多个本地存储库副本之间切换,否则无需设置它。$GOROOT_FINAL
当
$GOROOT
未显式设置时,已安装的二进制文件和脚本假设的值。它默认值为$GOROOT
的值。如果你想在一个位置构建 Go 树,但在构建后将其移至其他位置,请将$GOROOT_FINAL
设置为最终位置。$GOPATH
Go 分发版之外的 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
$GOARCH
aix
ppc64
android
386
android
amd64
android
arm
android
arm64
darwin
amd64
darwin
arm64
dragonfly
amd64
freebsd
386
freebsd
amd64
freebsd
arm
illumos
amd64
ios
arm64
js
wasm
linux
386
linux
amd64
linux
arm
linux
arm64
linux
loong64
linux
mips
linux
mipsle
linux
mips64
linux
mips64le
linux
ppc64
linux
ppc64le
linux
riscv64
linux
s390x
netbsd
386
netbsd
amd64
netbsd
arm
openbsd
386
openbsd
amd64
openbsd
arm
openbsd
arm64
plan9
386
plan9
amd64
plan9
arm
solaris
amd64
wasip1
wasm
windows
386
windows
amd64
windows
arm
windows
arm64
$GOHOSTOS
和$GOHOSTARCH
主机操作系统的名称和编译体系结构。它们默认为主机系统的操作系统和体系结构。
有效选择与上述
$GOOS
和$GOARCH
的选择相同。指定的值必须与本地系统兼容。例如,你应该不在 x86 系统上将$GOHOSTARCH
设置为arm
。$GO386
(仅限于386
,默认值为sse2
)此变量控制 gc 如何实现浮点运算。
GO386=softfloat
:使用软件浮点运算;应支持所有 x86 芯片(奔腾 MMX 或更高版本)。GO386=sse2
:使用 SSE2 进行浮点运算;性能更好,但仅在奔腾 4/Opteron/Athlon 64 或更高版本上可用。
$GOARM
(仅限于arm
;默认值为在目标处理器上构建时自动检测,否则为 7)这将设置运行时应该定位的 ARM 浮点协处理器架构版本。如果你在目标系统上编译,它的值将被自动检测。
GOARM=5
:使用软件浮点;当 CPU 没有 VFP 协处理器时GOARM=6
:仅使用 VFPv1;默认值为交叉编译;通常为 ARM11 或更好的内核(VFPv2 或更好的内核也支持)GOARM=7
:使用 VFPv3;通常为 Cortex-A 内核
如有疑问,请勿设置此变量,并在首次运行 Go 可执行文件时根据需要进行调整。GoARM 页面位于Go 社区维基 上,其中包含有关 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 指令
$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 树不需要设置任何这些变量。