Go語言的包管理
1 概述
Go 語言的原始碼複用建立在包(package)基礎之上。包通過 package, import, GOPATH 操作完成。
2 main包
Go 語言的入口 main() 函式所在的包(package)叫 main,main 包想要引用別的程式碼,需要import匯入!
3 包定義,package
Go 語言的包與資料夾一一對應,同一個目錄下的所有.go檔案的第一行新增 包定義,以標記該檔案歸屬的包,演示語法:
package 包名
包需要滿足:
- 一個目錄下的同級檔案歸屬一個包。
- 包名可以與其目錄不同名。
- 包名為 main 的包為應用程式的入口包,其他包不能使用。
包可以巢狀定義,對應的就是巢狀目錄,但包名應該與所在的目錄一致,例如:
// 檔案:foo/bar/tool.go中 package bar // 可以被匯出的函式 func FuncPublic() { } // 不可以被匯出的函式 func funcPrivate() { }
包中,通過識別符號首字母是否大寫,來確定是否可以被匯出。首字母大寫才可以被匯出,視為 public 公共的資源。
4 匯入包,import
要引用其他包,可以使用 import 關鍵字,可以單個匯入或者批量匯入,語法演示:
// 單個匯入 import "package" // 批量匯入 import ( "package1" "package2" )
匯入時,可以為包定義別名,語法演示:
import ( p1 "package1" p2 "package2" ) // 使用時 p1.Method()
以上測試請使用系統包測試。若需要匯入自定義包,需要設定GOPATH環境變數。
4 GOPATH環境變數
import匯入時,會從GO的安裝目錄(也就是GOROOT環境變數設定的目錄)和GOPATH環境變數設定的目錄中,檢索 src/package 來匯入包。如果不存在,則匯入失敗。
GOROOT,就是GO內建的包所在的位置。
GOPATH,就是我們自己定義的包的位置。
通常我們在開發Go專案時,除錯或者編譯構建時,需要設定GOPATH指向我們的專案目錄,目錄中的src目錄中的包就可以被匯入了:
例如,我麼的專案目錄為: D:\projects\goProject,那麼我麼就需要將我們的原始碼放在 D:\projects\goProject\src 下,同時設定GOPATH為 D:\projects\goProject。設定GOPATH的方案有:
- windows 通過 系統->系統資訊->高階系統設定->環境變數 中完成設定。
- windows 中通過 CMD 或者 powershell 也可以完成設定。通常是臨時有效的,CMD或者powershell關閉失效!
CMD: set GOPATH=D:\projects\goProject set GOPATH 可以檢視 powershell: $env:GOPATH="D:\projects\goProject" $env:GOPATH 可以檢視
- linux 通過 /etc/profile 進行設定
5 init() 包初始化
可以在原始碼中,定義 init() 函式。此函式會在包被匯入時執行,例如如果是在 main 中匯入包,包中存在 init(),那麼 init() 中的程式碼會在 main() 函式執行前執行,用於初始化包所需要的特定資料。例如:
包原始碼:
src/userPackage/tool.go package userPackage import "fmt" func init() { fmt.Println("tool init") }
主函式原始碼:
src/main.go package main import ( "userPackage" ) func main() { fmt.Println("main run") // 使用userPackage userPackage.SomeFunc() }
執行時,會先輸出 "tool init",再輸出 "main run"。
如果僅僅需要匯入包時執行初始化操作,並不需要使用包內的其他函式,常量等資源。則可以在匯入包時,匿名匯入:
import ( _ "userPackage" )
使用下劃線作為包的別名,會僅僅執行init()