1. 程式人生 > >go語言系列一之工作區和GOPATH

go語言系列一之工作區和GOPATH

從今天開始我們一起來學習GO語言,一起努力,一起成長

Go 語言被設計成一門應用於搭載 Web 伺服器,儲存叢集或類似用途的巨型中央伺服器的系統程式語言。

對於高效能分散式系統領域而言,Go 語言無疑比大多數其它語言有著更高的開發效率。

它提供了海量並行的支援,這對於遊戲服務端的開發而言是再好不過了。

先說一下go語言,GO是一個開源的程式語言,它能讓構造簡單、可靠且高效的軟體變得容易

Go是從2007年末由Robert Griesemer, Rob Pike, Ken Thompson主持開發,後來還加入了Ian Lance Taylor, Russ Cox等人,

並最終於2009年11月開源

在2012年早些時候釋出了Go 1穩定版本。

從Go 1.5 版本的自舉(即用 Go 語言編寫程式來實現

Go 語言自身),到 Go 1.7 版本的極速 GC(也稱垃圾回收器),

再到 2018 年 2 月釋出的 Go 1.10 版本對其自帶工具的全面升級,

以及可預見的後續版本的關鍵特性,比如用來做程式依賴管理的命令,這些都無不令我們歡欣。

Go 語言在一步步走向輝煌的同時,顯然已經成為軟體工程師們最喜愛的程式語言之一。

現在Go的開發已經是完全開放的,並且擁有一個活躍的社群。

GO語言具有簡介、快速、安全、並行、有趣、開源、記憶體管理、陣列安全、編譯迅速等特色

不管學習什麼語言,我們第一個要做的事都是要先根據自己電腦的構架和作業系統,從官網下載對應的二進位制包(也就是安裝包)安裝,並且配置環境變數,並且通過命令列中輸入 go version來驗證是否安裝成功

安裝後目錄說明

Go語言安裝之後,(我是選擇的安裝在D盤下)D:\Go目錄下一共有9個目錄與9個檔案,如下圖:

api — 目錄,包含所有API列表,方便IDE使用

bin— 目錄,存放編譯後的可執行檔案

blog— 目錄,

doc— 目錄,幫助文件

lib— 目錄,

misc— 目錄,

pkg— 目錄,存放編譯後的包檔案。pkg中的檔案是Go編譯生成的

src— 目錄,存放專案原始檔

注:一般,bin和pkg目錄可以不建立,go命令會自動建立(如 go install),只需要建立src目錄即可。

Authors— 檔案,作者列表,用記事本開啟

CONTRIBUTING.md— 檔案,

CONTRIBUTORS— 檔案,

favicon.ico— 檔案,

LICENSE— 檔案,license,用記事本開啟

PATENTS— 檔案,

README.md— 檔案,

robots.txt— 檔案,使用robots.txt阻止對網址的訪問,

VERSION— 檔案,版本資訊,用記事本開啟

設定GO環境變數

(我的安裝完成後是自動配置的環境變數)

變數名GOROOT,變數值C:\Go\

修改系統變數Path,新增C:\Go\bin\

一般情況下,我們應該配置 3 個環境變數,即 GOROOT、GOPATH和GOBIN

其中GOPATH的含義是最多的,也是最重要的,那麼設定GOPATH有什麼意義呢?

標準參考回答是:環境變數 GOPATH 的值可以是一個目錄的路徑,也可以包含多個目錄路徑,每個目錄都代表 Go 語言的一個工作區(workspace)。這些工作區用於放置 Go 語言的原始碼檔案(source file),以及安裝(install)後的歸檔檔案(archive file,也就是以“.a”為副檔名的檔案)和可執行檔案(executable file)。

Go 語言專案在其生命週期內的所有操作(編碼、依賴管理、構建、測試、安裝等)基本上都是圍繞著 GOPATH 和工作區進行的。

和其他的語言一樣,go語言的原始碼是以程式碼包為基本組織單位的,在檔案系統中,這些程式碼包其實是與目錄--對應的。目錄可以有子目錄,所以程式碼包也可以有子包。

一個程式碼包中可以包含任意個以.go 為副檔名的原始碼檔案,這些原始碼檔案都需要被宣告為屬於同一個程式碼包。程式碼包的名稱一般會與這些原始碼檔案所在的目錄同名。如果不同名,那麼在構建、安裝的過程中會以程式碼包名稱為準。

每個程式碼包都會有匯入路徑。程式碼包的匯入路徑是其他程式碼在使用該包中的程式實體時需要引入的路徑。在實際使用程式實體之前,我們必須先匯入其所在的程式碼包。具體的方式就是

import "github.com/labstack/echo"

在工作區中,一個程式碼包的匯入路徑實際上就是從 src 子目錄,到該包的實際儲存位置的相對路徑。

所以說,Go 語言原始碼的組織方式就是以環境變數 GOPATH、工作區、src 目錄和程式碼包為主線的。一般情況下,Go 語言的原始碼檔案都需要被存放在環境變數 GOPATH 包含的某個工作區(目錄)中的 src 目錄下的某個程式碼包(目錄)中。

原始碼檔案在安裝後如果產生了歸檔檔案,就會放進該工作區的PKG子目錄;

如果產生了科學、執行檔案,就可能會放進該工作區的bin子目錄

歸檔檔案存放的具體位置和規則

原始檔會以程式碼包的形式組織起來,一個程式碼包其實就對應一個目錄。安裝某個程式碼包其實就對應一個目錄。安裝某個程式碼包而產生的歸檔檔案是與這個程式碼包同名的。

放置它的相對目錄就是該程式碼包的匯入路徑的直接父級。比如,一個已存在的程式碼包的匯入路徑是

github.com/labstack/echo

那麼執行命令

go install github.com/labstack/echo

生成的歸檔檔案的相對目錄就是 github.com/labstack/echo  檔名為echo.a

另外  這個程式碼還有另外一層含義

就是:該程式碼包的原始碼檔案存在於 GitHub 網站的 labstack 組的程式碼倉庫 echo 中。

歸檔檔案的相對目錄與 pkg 目錄之間還有一級目錄,叫做平臺相關目錄。

平臺相關目錄的名稱是由 build(也稱“構建”)的目標作業系統、下劃線和目標計算架構的代號組成的。

比如,構建某個程式碼包時的目標作業系統是 Linux,目標計算架構是 64 位的,那麼對應的平臺相關目錄就是 linux_amd64。

因此,上述程式碼包的歸檔檔案就會被放置在當前工作區的子目錄 pkg/linux_amd64/github.com/labstack 中。

總之,某個工作區的src子目錄下的原始碼檔案在安裝後一般會被放置到當前工作區的pkg子目錄下對應的目錄中,或者被直接放置到該工作區的bin子目錄中。

構建和安裝GO程式的過程

構建使用命令go  build,安裝使用命令go  install。構建和安裝程式碼包的時候都會執行編譯、打包等操作,並且這些操作生產的任何檔案都會先被儲存到某個臨時的目錄中。

如果構建的是命令原始碼檔案,那麼操作的結果檔案會被搬運到那個原始碼檔案所在的目錄中。

安裝操作會先執行構建,然後還會進行連結操作,並且把結果檔案搬運到指定目錄。

進一步說,如果安裝的是庫原始碼檔案,那麼結果檔案會被搬運到它所在工作區的 pkg 目錄下的某個子目錄中。

如果安裝的是命令原始碼檔案,那麼結果檔案會被搬運到它所在工作區的 bin 目錄中,或者環境變數GOBIN指向的目錄中。

這裡需要記住的是,構建和安裝的不同之處,以及執行相應命令後得到的結果檔案都會出現在哪裡。

 go build 命令一些可選項的用途和用法

在執行go build命令的時候,預設不會編譯目的碼包所依賴的那些程式碼包。當然,如果被依賴的程式碼包的歸檔檔案不存在,或者原始碼檔案有了變化,那它還是會被編譯。

如果要強制編譯它們,可以在執行命令的時候加入標記-a。此時,不但目的碼包總是會被編譯,它依賴的程式碼包也總會被編譯,即使依賴的是標準庫中的程式碼包也是如此。另外,如果不但要編譯依賴的程式碼包,還要安裝它們的歸檔檔案,那麼可以加入標記-i

確定哪些程式碼包被編譯的兩種方法。

1.go  build  -x   可以看到go  build命令具體都執行了哪些操作

   go  build  -n   可以只檢視具體操作而不執行

2.go  build  -v 可以看到go  build 命令編譯的程式碼包的名稱

關於Go原始碼安裝的一個命令 go get

go  get會自動從一些主流公用程式碼倉庫(比如GitHub)下載目的碼包,並且把他們安裝到環境變數GOPATH包含的第1工作區的相應的目錄中。如果存在環境變數GOBIN,那麼僅包含命令原始碼檔案的程式碼包會被安裝到GOBIN指向的那個目錄。

最常用的幾個標記有下面幾種。

-u::下載並安裝程式碼包,不論工作區中是否已存在它們。

-d::只下載程式碼包,不安裝程式碼包。

-fix::在下載程式碼包後先執行一個用於根據當前 Go 語言版本修正程式碼的工具,然後再安裝程式碼包。

-t:同時下載測試所需的程式碼包。

-insecure:允許通過非安全的網路協議下載和安裝程式碼包。HTTP 就是這樣的協議。

工作區和 GOPATH 的概念和含義是每個 Go 工程師都需要了解的。

雖然它們都比較簡單,但是說它們是 Go 程式開發的核心知識並不為過。

然而,很多人會忽略掉了它們。

Go 語言提供的很多工具都是在 GOPATH 和工作區的基礎上執行的,

比如上面提到的go build、go install和go get,這三個命令也是我們最常用到的。

工作區是指: 放go的原始碼目錄。
gopath是指:指向工作區的路徑。

歸檔檔案在Linux下就是.a檔案,也就是archive檔案,是程式編譯成功後生成的靜態庫檔案。寫過C程式的朋友都知道,這是程式編譯後生成的靜態庫檔案。這跟Java的jar包還不太一樣,jar包相當於動態連結庫了。