從原始碼安裝 Go
這一主題描述如何從原始碼建置並執行 Go。若要使用安裝程式安裝,請參閱 下載並安裝。
簡介
Go 是開源專案,以 BSD-style 授權 進行發行。本文件說明你如何檢出原始碼、自行建置在你的電腦上並執行它們。
大部份的使用者不需要執行這項操作,而是會按照 下載並安裝 中所述,從預編譯的二進位套件安裝,這是一個更為簡單的程序。但如果你想協助開發預編譯套件中的內容,請繼續閱讀。
有兩個官方的 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
- 大端、小端 64 位和 32 位的
MIPS
指令集。 -
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
指令。)p>
如果你沒有執行的 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>
其中 <標籤>
是版本的發行字串。
Go 會安裝在結帳的目錄中。例如,如果 Go 是在 $HOME/goroot
中結帳,可執行檔案就會安裝在 $HOME/goroot/bin
中。這個目錄可以有任意的名稱,但請注意,如果 Go 是在 $HOME/go
中結帳,它會與 $GOPATH
的預設位置產生衝突. 請參閱以下的 GOPATH
。
提醒:如果您選擇也要編譯來自來源的開機二進位檔(在較早的區段中),您仍然需要在這個時間點再次 git clone
(以結帳最新的 <標籤>
),因為您必須保持 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
其中 <標籤>
是版本的發行字串。
選擇性環境變數
可以透過環境變數自訂 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
)。模組會下載並快取在$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
(或$HOME/go/bin
,如果未設定GOPATH
)。安裝後,您會想將此目錄新增到您的$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 可執行檔時視需要調整它。
GoARM
Go 社群 Wiki上 的頁面包含更多關於 Go 對 ARM 支援的詳細資料。$GOAMD64
(僅適用於amd64
;預設值為v1
)這是設定要編譯的微架構層級。有效的數值為
v1
(預設值)、v2
、v3
、v4
。請參閱Go Wiki 最低需求頁面以取得更多資訊。$GOMIPS
(僅適用於mips
和mipsle
)
$GOMIPS64
(僅適用於mips64
和mips64le
)這些變數會設定是否使用浮點指令。設定為「
hardfloat
」以使用浮點指令;這是預設值。設定為「softfloat
」以使用軟體浮點。$GOPPC64
(僅適用於ppc64
和ppc64le
)這個變數設定編譯器要採用的處理器層級(即指令集架構版本)。預設值為
power8
。GOPPC64=power8
:產生 ISA v2.07 指令GOPPC64=power9
:產生 ISA v3.00 指令
$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 樹狀結構。