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