從原始碼安裝 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 目錄樹不需要設定這些變數中的任何一個。