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