GO語言————2、GO語言環境安裝

FLy_鵬程萬里發表於2018-06-23

2.1 平臺與架構

Go 語言開發團隊開發了適用於以下作業系統的編譯器:

  • Linux
  • FreeBSD
  • Mac OS X(也稱為 Darwin)

目前有2個版本的編譯器:Go 原生編譯器 gc 和非原生編譯器 gccgo,這兩款編譯器都是在類 Unix 系統下工作 。其中,gc 版本的編譯器已經被移植到 Windows 平臺上,並整合在主要發行版中,你也可以通過安裝 MinGW 從而在 Windows 平臺下使用 gcc 編譯器。這兩個編譯器都是以單通道的形式工作。

你可以獲取以下平臺上的 Go 1.4 原始碼和二進位制檔案:

  • Linux 2.6+:amd64、386 和 arm 架構
  • Mac OS X(Snow Leopard + Lion):amd64 和 386 架構
  • Windows 2000+:amd64 和 386 架構

對於非常底層的純 Go 語言程式碼或者包而言,在各個作業系統平臺上的可移植性是非常強的,只需要將原始碼拷貝到相應平臺上進行編譯即可,或者可以使用交叉編譯來構建目標平臺的應用程式(第 2.2 節)。但如果你打算使用 cgo 或者類似檔案監控系統的軟體,就需要根據實際情況進行相應地修改了。

1、Go 原生編譯器 gc:

主要基於 Ken Thompson 先前在 Plan 9 作業系統上使用的 C 工具鏈。Go 語言的編譯器和連結器都是使用 C 語言編寫併產生原生程式碼,Go 不存在自我引導之類的功能。
因此如果使用一個有不同指令集的編譯器來構建 Go 程式,就需要針對作業系統和處理器架構(32 位作業系統或 64 位作業系統)進行區別對待。
這款編譯器使用非分代、無壓縮和並行的方式進行編譯,它的編譯速度要比 gccgo 更快,產生更好的原生程式碼,但編譯後的程式不能夠使用 gcc 進行連結。

編譯器目前支援以下基於 Intel 或 AMD 處理器架構的程式構建。

圖2.1 gc 編譯器支援的處理器架構

當你第一次看到這套命名系統的時候你會覺得很奇葩,不過這些命名都是來自於 Plan 9 專案。

 g = 編譯器:將原始碼編譯為專案程式碼(程式文字)
 l = 連結器:將專案程式碼連結到可執行的二進位制檔案(機器程式碼)

(相關的 C 編譯器名稱為 6c、8c 和 5c,相關的彙編器名稱為 6a、8a 和 5a)

標記(Flags) 是指可以通過命令列設定可選引數來影響編譯器或連結器的構建過程或得到一個特殊的目標結果。

可用的編譯器標記如下:

 flags:
 -I 針對包的目錄搜尋
 -d 列印宣告資訊
 -e 不限制錯誤列印的個數
 -f 列印棧結構
 -h 發生錯誤時進入恐慌(panic)狀態
 -o 指定輸出檔名 // 詳見第3.4節
 -S 列印產生的彙編程式碼
 -V 列印編譯器版本 // 詳見第2.3節
 -u 禁止使用 unsafe 包中的程式碼
 -w 列印歸類後的語法解析樹
 -x 列印 lex tokens

從 Go 1.0.3 版本開始,不再使用 8g,8l 之類的指令進行程式的構建,取而代之的是統一的 go build 和 go install 等命令,而這些指令會自動呼叫相關的編譯器或連結器。

如果你想獲得更深層次的資訊,你可以在目錄 $GOROOT/src/cmd 下找到編譯器和連結器的原始碼。Go 語言本身是由 C 語言開發的,而不是 Go 語言(Go 1.5 開始自舉)。詞法分析程式是 GNU bison,語法分析程式是名為$GOROOT/src/cmd/gc/go.y 的 yacc 檔案,它會在同一目錄輸出 y.tab.{c,h} 檔案。如果你想知道更多有關構建過程的資訊,你可以在 $GOROOT/src/make.bash 中找到。

大部分的目錄都包含了名為 doc.go 的檔案,這個檔案提供了更多詳細的資訊。

2、gccgo 編譯器:

一款相對於 gc 而言更加傳統的編譯器,使用 GCC 作為後端。GCC 是一款非常流行的 GNU 編譯器,它能夠構建基於眾多處理器架構的應用程式。編譯速度相對 gc 較慢,但產生的原生程式碼執行要稍微快一點。它同時也提供一些與 C 語言之間的互操作性。

從 Go 1 版本開始,gc 和 gccgo 在編譯方面都有等價的功能。

3、副檔名與包(package):

Go 語言原始檔的副檔名很顯然就是 .go

C 檔案使用字尾名 .c,彙編檔案使用字尾名 .s。所有的原始碼檔案都是通過包(packages)來組織。包含可執行程式碼的包檔案在被壓縮後使用副檔名 .a(AR 文件)。

Go 語言的標準庫(第 9.1 節)包檔案在被安裝後就是使用這種格式的檔案。

注意 當你在建立目錄時,資料夾名稱永遠不應該包含空格,而應該使用下劃線 "_" 或者其它一般符號代替。

2.2 Go 環境變數

Go 開發環境依賴於一些作業系統環境變數,你最好在安裝 Go 之間就已經設定好他們。如果你使用的是 Windows 的話,你完全不用進行手動設定,Go 將被預設安裝在目錄 c:/go 下。這裡列舉幾個最為重要的環境變數:

  • $GOROOT 表示 Go 在你的電腦上的安裝位置,它的值一般都是 $HOME/go,當然,你也可以安裝在別的地方。
  • $GOARCH 表示目標機器的處理器架構,它的值可以是 386、amd64 或 arm。
  • $GOOS 表示目標機器的作業系統,它的值可以是 darwin、freebsd、linux 或 windows。
  • $GOBIN 表示編譯器和連結器的安裝位置,預設是 $GOROOT/bin,如果你使用的是 Go 1.0.3 及以後的版本,一般情況下你可以將它的值設定為空,Go 將會使用前面提到的預設值。

目標機器是指你打算執行你的 Go 應用程式的機器。

Go 編譯器支援交叉編譯,也就是說你可以在一臺機器上構建執行在具有不同作業系統和處理器架構上執行的應用程式,也就是說編寫原始碼的機器可以和目標機器有完全不同的特性(作業系統與處理器架構)。

為了區分本地機器和目標機器,你可以使用 $GOHOSTOS 和 $GOHOSTARCH 設定本地機器的作業系統名稱和編譯體系結構,這兩個變數只有在進行交叉編譯的時候才會用到,如果你不進行顯示設定,他們的值會和本地機器($GOOS 和 $GOARCH)一樣。

  • $GOPATH 預設採用和 $GOROOT 一樣的值,但從 Go 1.1 版本開始,你必須修改為其它路徑。它可以包含多個包含 Go 語言原始碼檔案、包檔案和可執行檔案的路徑,而這些路徑下又必須分別包含三個規定的目錄:srcpkg 和 bin,這三個目錄分別用於存放原始碼檔案、包檔案和可執行檔案。
  • $GOARM 專門針對基於 arm 架構的處理器,它的值可以是 5 或 6,預設為 6。
  • $GOMAXPROCS 用於設定應用程式可使用的處理器個數與核數,詳見第 14.1.3 節。

在接下來的章節中,我們將會討論如何在 Linux、Mac OS X 和 Windows 上安裝 Go 語言。在 FreeBSD 上的安裝和 Linux 非常類似。開發團隊正在嘗試將 Go 語言移植到其它例如 OpenBSD、DragonFlyBSD、NetBSD、Plan 9、Haiku 和 Solaris 作業系統上,你可以在這個頁面找到最近的動態:Go Porting Efforts

2.3 在 Linux 上安裝 Go

如果你能夠自己下載並編譯 Go 的原始碼來說是非常有教育意義的,你可以根據這個頁面找到安裝指南和下載地址:Download the Go distribution

我們接下來也會帶你一步步的完成安裝過程。

1、設定 Go 環境變數

我們在 Linux 系統下一般通過檔案 $HOME/.bashrc 配置自定義環境變數,根據不同的發行版也可能是檔案$HOME/.profile,然後使用 gedit 或 vi 來編輯檔案內容。

 export GOROOT=$HOME/go
為了確保相關檔案在檔案系統的任何地方都能被呼叫,你還需要新增以下內容:
 export PATH=$PATH:$GOROOT/bin
在開發 Go 專案時,你還需要一個環境變數來儲存你的工作目錄。
 export GOPATH=$HOME/Applications/Go

$GOPATH 可以包含多個工作目錄,取決於你的個人情況。如果你設定了多個工作目錄,那麼當你在之後使用 go get(遠端包安裝命令)時遠端包將會被安裝在第一個目錄下。

在完成這些設定後,你需要在終端輸入指令 source .bashrc 以使這些環境變數生效。然後重啟終端,輸入 go env 和env 來檢查環境變數是否設定正確。

2、安裝 C 工具

Go 的工具鏈是用 C 語言編寫的,因此在安裝 Go 之前你需要先安裝相關的 C 工具。如果你使用的是 Ubuntu 的話,你可以在終端輸入以下指令( 譯者注:由於網路環境的特殊性,你可能需要將每個工具分開安裝 )。

 sudo apt-get install bison ed gawk gcc libc6-dev make

你可以在其它發行版上使用 RPM 之類的工具。

3、獲取 Go 原始碼

從 官方頁面 或 國內映象 下載 Go 的原始碼包到你的計算機上,然後將解壓後的目錄 go 通過命令移動到 $GOROOT 所指向的位置。

wget https://storage.googleapis.com/golang/go<VERSION>.src.tar.gz
 tar -zxvf go<VERSION>.src.tar.gz
 sudo mv go $GOROOT

4、構建 Go

在終端使用以下指令來進行編譯工作。

 cd $GOROOT/src
 ./all.bash

在完成編譯之後(通常在 1 分鐘以內,如果你在 B 型樹莓派上編譯,一般需要 1 個小時),你會在終端看到如下資訊被列印:


圖 2.3 完成編譯後在終端列印的資訊

注意事項

在測試 net/http 包時有一個測試會嘗試連線 google.com,你可能會看到如下所示的一個無厘頭的錯誤報告:

 ‘make[2]: Leaving directory `/localusr/go/src/pkg/net’

如果你正在使用一個帶有防火牆的機器,我建議你可以在編譯過程中暫時關閉防火牆,以避免不必要的錯誤。

解決這個問題的另一個辦法是通過設定環境變數 $DISABLE_NET_TESTS 來告訴構建工具忽略 net/http 包的相關測試:

 export DISABLE_NET_TESTS=1

如果你完全不想執行包的測試,你可以直接執行 ./make.bash 來進行單純的構建過程。

5、測試安裝

使用你最喜愛的編輯器來輸入以下內容,並儲存為檔名 test.go

示例 2.1 hello_world1.go

package main

func main() {
	println("Hello", "world")
}

切換相關目錄到下,然後執行指令 go run hello_world1.go,將會列印資訊:Hello, world

6、驗證安裝版本

你可以通過在終端輸入指令 go version 來列印 Go 的版本資訊。

如果你想要通過 Go 程式碼在執行時檢測版本,可以通過以下例子實現。

示例 2.2 version.go

package main

import (
	"fmt"
	"runtime"
)

func main() {
	fmt.Printf("%s", runtime.Version())
}
這段程式碼將會輸出 go1.4.2 或類似字串。

7、更新版本

你可以在 釋出歷史 頁面檢視到最新的穩定版。

當前最新的穩定版 Go 1 系列於 2012 年 3 月 28 日釋出。

Go 的原始碼有以下三個分支:

 - Go release:最新穩定版,實際開發最佳選擇
 - Go weekly:包含最近更新的版本,一般每週更新一次
 - Go tip:永遠保持最新的版本,相當於內測版

當你在使用不同的版本時,注意官方部落格釋出的資訊,因為你所查閱的文件可能和你正在使用的版本不相符。

2.4 在 Mac OS X 上安裝 Go

如果你想要在你的 Mac 系統上安裝 Go,則必須使用 Intel 64 位處理器,Go 不支援 PowerPC 處理器。

你可以通過該頁面檢視有關在 PowerPC 處理器上的移植進度:https://codedr-go-ppc.googlecode.com/hg/

注意事項

在 Mac 系統下使用到的 C 工具鏈是 Xcode 的一部分,因此你需要通過安裝 Xcode 來完成這些工具的安裝。你並不需要安裝完整的 Xcode,而只需要安裝它的命令列工具部分。

你可以在 下載頁面 頁面下載到 Mac 系統下的一鍵安裝包或原始碼自行編譯。

通過原始碼編譯安裝的過程與環境變數的配置與在 Linux 系統非常相似,因此不再贅述。

2.5 在 Windows 上安裝 Go

你可以在 下載頁面 頁面下載到 Windows 系統下的一鍵安裝包。

前期的 Windows 移植工作由 Hector Chu 完成,但目前的發行版已經由 Joe Poirier 全職維護。

在完成安裝包的安裝之後,你只需要配置 $GOPATH 這一個環境變數就可以開始使用 Go 語言進行開發了,其它的環境變數安裝包均會進行自動設定。在預設情況下,Go 將會被安裝在目錄 c:\go 下,但如果你在安裝過程中修改安裝目錄,則可能需要手動修改所有的環境變數的值。

如果你想要測試安裝,則可以使用指令 go run 執行 hello_world1.go

如果發生錯誤 fatal error: can’t find import: fmt 則說明你的環境變數沒有配置正確。

如果你想要在 Windows 下使用 cgo (呼叫 C 語言寫的程式碼),則需要安裝 MinGW,一般推薦安裝 TDM-GCC。如果你使用的是 64 位作業系統,請務必安裝 64 位版本的 MinGW。安裝完成進行環境變數等相關配置即可使用。

在 Windows 下執行在虛擬機器裡的 Linux 系統上安裝 Go

如果你想要在 Windows 下的虛擬機器裡的 Linux 系統上安裝 Go,你可以選擇使用虛擬機器軟體 VMware,下載 VMware player,搜尋並下載一個你喜歡的 Linux 發行版映象,然後安裝到虛擬機器裡,安裝 Go 的流程參考第 2.3 節中的內容。

2.6 安裝目錄清單

你的 Go 安裝目錄($GOROOT)的資料夾結構應該如下所示:

README.md, AUTHORS, CONTRIBUTORS, LICENSE

  • /bin:包含可執行檔案,如:編譯器,Go 工具
  • /doc:包含示例程式,程式碼工具,本地文件等
  • /lib:包含文件模版
  • /misc:包含與支援 Go 編輯器有關的配置檔案以及 cgo 的示例
  • /os_arch:包含標準庫的包的物件檔案(.a
  • /src:包含原始碼構建指令碼和標準庫的包的完整原始碼(Go 是一門開源語言)
  • /src/cmd:包含 Go 和 C 的編譯器和命令列指令碼

2.7 Go 執行時(runtime)

儘管 Go 編譯器產生的是本地可執行程式碼,這些程式碼仍舊執行在 Go 的 runtime(這部分的程式碼可以在 runtime 包中找到)當中。這個 runtime 類似 Java 和 .NET 語言所用到的虛擬機器,它負責管理包括記憶體分配、垃圾回收(第 10.8 節)、棧處理、goroutine、channel、切片(slice)、map 和反射(reflection)等等。

runtime 主要由 C 語言編寫(Go 1.5 開始自舉),並且是每個 Go 包的最頂級包。你可以在目錄 $GOROOT/src/runtime 中找到相關內容。

垃圾回收器 Go 擁有簡單卻高效的標記-清除回收器。它的主要思想來源於 IBM 的可複用垃圾回收器,旨在打造一個高效、低延遲的併發回收器。目前 gccgo 還沒有回收器,同時適用 gc 和 gccgo 的新回收器正在研發中。使用一門具有垃圾回收功能的程式語言不代表你可以避免記憶體分配所帶來的問題,分配和回收內容都是消耗 CPU 資源的一種行為。

Go 的可執行檔案都比相對應的原始碼檔案要大很多,這恰恰說明了 Go 的 runtime 嵌入到了每一個可執行檔案當中。當然,在部署到數量巨大的叢集時,較大的檔案體積也是比較頭疼的問題。但總得來說,Go 的部署工作還是要比 Java 和 Python 輕鬆得多。因為 Go 不需要依賴任何其它檔案,它只需要一個單獨的靜態檔案,這樣你也不會像使用其它語言一樣在各種不同版本的依賴檔案之間混淆。

2.8 Go 直譯器

因為 Go 具有像動態語言那樣快速編譯的能力,自然而然地就有人會問 Go 語言能否在 REPL(read-eval-print loop)程式設計環境下實現。Sebastien Binet 已經使用這種環境實現了一個 Go 直譯器,你可以在這個頁面找到:https://github.com/sbinet/igo

相關文章