从源代码安装 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源代码后,请进入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语言库),必须先安装如gcc或clang等C编译器。请使用系统标准安装方法进行安装。
若要在不启用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仓库的独立性。
(可选)切换到主分支
若您计划修改Go源代码并向项目提交变更,请将仓库从发布标签切换至主(开发)分支。否则请跳过此步骤。
$ git checkout master
安装Go
要构建Go发行版,请运行:
$ cd src $ ./make.bash
(在Windows系统下请使用make.bat。)
若一切顺利,将输出类似以下内容:
--- 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需要更多时间。
验证安装
通过构建一个简单程序来检查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 工具可以通过环境变量进行定制。 构建过程并不强制要求设置任何环境变量,但你可能会希望设置一些来覆盖默认值。 在运行 make.bash 时设置这些环境变量,将会为新构建的工具设置默认值。 在使用工具时,你可以针对特定的构建覆盖这些默认值,具体说明参见 go 命令文档。
$GOROOTGo 源码树的根目录,通常是
$HOME/go1.X。 其值在编译时会被嵌入到源码树中, 并且默认为运行all.bash的目录的上一级目录。 除非你想要在多个本地仓库副本之间切换,否则无需设置此变量。$GOOS和$GOARCH目标操作系统和编译架构的名称。
$GOOS默认值为引导工具链中runtime.GOOS的值。$GOARCH默认值为下文描述的$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$GOHOSTARCH宿主编译架构的名称。 其默认值为本地系统的架构。
有效选项与上面列出的
$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 可执行文件时根据需要进行调整。 Go 社区 wiki 上的 GoARM 页面包含有关 Go 的 ARM 支持的更多详细信息。
$GOARM64(仅适用于arm64架构;默认为v8.0)此变量设置编译所面向的 ARM64 架构版本。 请参阅 Go wiki 的 MinimumRequirements 页面 了解允许的选项。
$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。
需要再次强调的是,要构建、安装和开发 Go 源码树,这些变量都不是必须设置的。