從原始碼安裝 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 編譯環境可以透過環境變數進行自定義。構建不需要任何變數,但您可能希望設定一些變數來覆蓋預設值。
$GOROOTGo 樹的根目錄,通常是
$HOME/go1.X。它的值在編譯時內建到樹中,預設為執行all.bash的目錄的父目錄。除非您想在多個本地倉庫副本之間切換,否則無需設定此變數。$GOROOT_FINAL當未明確設定
$GOROOT時,安裝的二進位制檔案和指令碼假定的值。它預設為$GOROOT的值。如果您想在一個位置構建 Go 樹,但在構建後將其移動到其他位置,請將$GOROOT_FINAL設定為最終位置。$GOPATHGo 發行版之外的 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$GOARCHaixppc64android386androidamd64androidarmandroidarm64darwinamd64darwinarm64dragonflyamd64freebsd386freebsdamd64freebsdarmillumosamd64iosarm64jswasmlinux386linuxamd64linuxarmlinuxarm64linuxloong64linuxmipslinuxmipslelinuxmips64linuxmips64lelinuxppc64linuxppc64lelinuxriscv64linuxs390xnetbsd386netbsdamd64netbsdarmopenbsd386openbsdamd64openbsdarmopenbsdarm64plan9386plan9amd64plan9armsolarisamd64wasip1wasmwindows386windowsamd64windowsarmwindowsarm64$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 樹不需要設定這些變數中的任何一個。