从源代码安装 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 编译工具链,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 编译环境可以通过环境变量进行定制。构建过程不要求设置任何变量,但您可能希望设置一些变量来覆盖默认值。
$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 芯片(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 目录树不需要设置这些变量中的任何一个。