【Go】筆記一 | 工作區和GOPATH
阿新 • • 發佈:2019-01-04
核心知識
- GOPATH的意義在與程式碼結構分層
Go語言原始碼的組織方式
- 以程式碼包為基本組織單位
- 程式碼包與目錄一一對應
- 目錄有子目錄,程式碼包也有子包
程式碼包中可以任意個.go 副檔名的原始碼檔案,需要被宣告為屬於同一個程式碼包。
程式碼包的名稱一般會與這些原始碼檔案所在的目錄同名。如果不同名,那麼在構建、安裝的過程中會以程式碼包名稱為準。
每個程式碼包都會有匯入路徑。
程式碼包的匯入路徑是其他程式碼在使用該包中的程式實體時需要引入的路徑。
在實際使用程式實體之前,我們必須先匯入其所在的程式碼包。具體的方式就是import該程式碼包的匯入路徑。
import "github.com/labstack/echo"
在工作區中,一個程式碼包的匯入路徑實際上就是從 src 子目錄,到該包的實際儲存位置的相對路徑。
瞭解原始碼安裝後的結果
- 原始碼檔案通常會被放在某個工作區的 src 子目錄下
- 安裝後如果產生了歸檔檔案,就會放進該工作區的 pkg 子目錄
- 如果產生了可執行檔案,就可能會放進該工作區的 bin 子目錄。
歸檔檔案存放的具體位置和規則
- 原始碼檔案會以程式碼包的形式組織起來,一個程式碼包其實就對應一個目錄。
- 安裝某個程式碼包而產生的歸檔檔案是與這個程式碼包同名的。
- 放置它的相對目錄就是該程式碼包的匯入路徑的直接父級。
比如,一個已存在的程式碼包的匯入路徑是
github.com/labstack/echo
- 歸檔檔案的相對目錄與 pkg 目錄之間還有一級目錄,叫做平臺相關目錄。
平臺相關目錄的名稱是由 build(也稱“構建”)的目標作業系統、下劃線和目標計算架構的代號組成的。
理解構建和安裝 Go 程式的過程
- 構建使用命令go build,安裝使用命令go install
- 構建->庫原始碼檔案->臨時目錄
意義在於檢查和驗證 - 構建->命令原始碼檔案->原始碼檔案所在目錄
- 安裝->構建->連結->搬運到指定目錄
(如果安裝是庫原始碼原始檔,那麼就在pkg目錄的某個子目錄中)
(如果安裝是命令原始碼檔案,那麼就在bin目錄的某個子目錄中,或GOBIN)
go build 命令一些可選項的用途和用法
執行go build命令的時候,預設不會編譯目的碼包所依賴的那些程式碼包。
如果被依賴的程式碼包的歸檔檔案不存在,或者原始碼檔案有了變化,那它還是會被編譯。
執行命令的時候加入標記-a,可強制編譯。
此時,不但目的碼包總是會被編譯,它依賴的程式碼包也總會被編譯,即使依賴的是標準庫中的程式碼包也是如此。
確定哪些程式碼包被編譯
- -x 檢視執行了哪些操作
- -n 檢視而不執行操作
- -v 檢視編譯的程式碼包的名稱,也-a搭配更可口噢
設定GOPATH有什麼意義?
除了環境變數 GOPATH 的值可以是一個目錄的路徑,也可以包含多個目錄路徑,每個目錄都代表 Go 語言的一個工作區(workspace)。
意義在於程式碼結構的分層。
- 原始碼檔案放在工作區的src目錄
- 歸檔檔案放在工作區的pkg目錄
- 可執行檔案放在工作區的bin目錄
- 歸檔檔案的相對目錄與 pkg 目錄之間還有一級目錄,叫做平臺相關目錄。
知識補充
- 命令原始碼檔案,即包含 main() 入口函式的原始碼檔案。
- 歸檔檔案,就是archive檔案,也就是常見的.a檔案,實際上就是將多個原始碼檔案編譯生成的目標檔案(.o)打包歸檔成一份.a檔案,這是程式編譯後生成的靜態庫檔案。
額外知識
Go 語言在多個工作區中查詢依賴包的時候是以怎樣的順序進行的?
三個緯度延伸總結回答:
- 總執行順序的角度
引入的包 -> 當前包的變數常量 -> init()[多個同一包則按照順序執行] -> main函式 - 依賴包執行順序
被依賴的總是優先執行初始化,一個包只會被初始化一次。 a引入b,b引入c,則執行順序c -> b -> a - 單個包執行順序的角度
總的前提:按照包中原始檔名的字典順序來排序執行。
當前包排序後的變數常量 -> 排序後的init()
如果在多個工作區中都存在匯入路徑相同的程式碼包會產生衝突嗎?
不衝突,因為按順序找到所需要的包就不往後找了
小結
- 環境變數 GOPATH 指向的是一個或多個工作區,而每個工作區中都會有以程式碼包為基本組織形式的原始碼檔案。
- GOPATH的意義在與程式碼結構分層
————————————————————————————————
筆記來源: