套件(package)是多個Go原始碼的集合,是一種高階的程式碼重複使用方案。 Go語言的套件借助了目錄樹的組織形式,一般套件的名稱就是其原始檔案所在目錄的名稱;套件可以定義在很深的目錄中,套件名稱的定義是不包括目錄路徑的,但是套件在引用時一般使用全路徑引用。
本教學操作環境:windows7系統、GO 1.18版本、Dell G3電腦。
Go語言是使用套件來組織原始碼的,套件(package)是多個 Go 原始碼的集合,是一種高階的程式碼多用方案。 Go語言中為我們提供了許多內建包,如 fmt、os、io 等。
Golang 中的套件與資料夾是一一對應的,必須在 GOPATH 目錄下建立才能使用。 Golang 中的一個套件需要引用另一個套件的內容,那麼就必須在開始使用 import 關鍵字進行匯入才可以使用。
任何原始碼檔案必須屬於某個套件,同時原始碼檔案的第一行有效程式碼必須是package pacakgeName
語句,透過該語句宣告自己所在的程式。
套件的基本概念
Go語言的套件借助了目錄樹的組織形式,一般套件的名稱就是其原始檔案所在目錄的名稱,雖然Go語言沒有強制要求包名必須和其所在的目錄名同名,但還是建議包名和所在目錄同名,這樣結構更清晰。
套件可以定義在很深的目錄中,套件名稱的定義是不包含目錄路徑的,但是套件在引用時一般使用全路徑引用。例如在GOPATH/src/a/b/
下定義一個套件 c。在套件c 的原始碼中只需宣告為package c
,而不是宣告為package a/b/c
,但在導入c 套件時,需要帶上路徑,例如 import "a/b/c"
。
套件的習慣用法:
套件名稱一般是小寫的,使用一個簡短且有意義的名稱。
套件名稱一般要和所在的目錄同名,也可以不同,套件名稱中不能包含- 等特殊符號。
套件一般會使用網域名稱作為目錄名稱,這樣可以保證套件名稱的唯一性,例如GitHub 專案的套件一般會放到GOPATH/src/github.com/userName /projectName
目錄下。
套件名為 main 的套件為應用程式的入口包,編譯不包含 main 套件的源碼檔案時不會得到可執行檔。
一個資料夾下的所有原始碼檔案只能屬於同一個包,同樣屬於同一個包的源碼檔案不能放在多個資料夾下。
套件的導入
#要引用程式碼中其他套件的內容,需要使用import 關鍵字導入使用的包。具體語法如下:
import "包的路径"
注意事項:
import 導入語句通常放在原始碼檔案開頭包宣告語句的下面;
匯入的套件名稱需要使用雙引號包裹起來;
套件名稱是從GOPATH/src/
後開始計算的,使用/ 進行路徑分隔。
套件的導入路徑
#套件的參考路徑有兩種寫法,分別是全路徑導入和相對路徑導入。
全路徑導入
套件的絕對路徑就是GOROOT/src/或GOPATH/src/後麵包的存放路徑,如下所示:
import "lab/test" import "database/sql/driver" import "database/sql"
上面程式碼的意思如下:
test 套件是自訂的套件,其原始碼位於GOPATH/src/lab/test 目錄下;
driver 套件的原始碼位於GOROOT/src/database/sql/driver 目錄下;
sql 套件的源碼位於GOROOT/src/database/sql 目錄下。
相對路徑導入
相對路徑只能用於導入GOPATH 下的包,標準包的導入只能使用全路徑導入。
例如包a 的所在路徑是GOPATH/src/lab/a,包b 的所在路徑為GOPATH/src/lab/b,如果在包b 中導入包a ,則可以使用相對路徑導入方式。範例如下:
// 相对路径导入 import "../a"
當然了,也可以使用上面的全路徑導入,如下所示:
// 全路径导入 import "lab/a"
套件載入
透過前面一系列的學習相信大家已經大致了解了Go 程式的啟動與載入過程,在執行main 套件的mian 函數之前, Go 引導程式會先對整個程式的套件進行初始化。整個執行的流程如下圖所示。
圖:Go 套件的初始化
Go語言套件的初始化有以下特點:
套件初始化程序從 main 函數引用的套件開始,逐級查找包的引用,直到找到沒有引用其他包的包,最終產生一個包引用的有向無環圖。
Go 編譯器會將有向無環圖轉換為一棵樹,然後從樹的葉子節點開始逐層向上對套件進行初始化。
單一套件的初始化過程如上圖所示,先初始化常數,然後是全域變量,最後執行套件的 init 函數。
Golang套件使用總結
#Go 語言的原始碼組織使用的是套件的形式。 Go 語言的 main 函數只有在 main 套件裡面才可以被系統執行。
以上是Go語言中什麼是包的詳細內容。更多資訊請關注PHP中文網其他相關文章!