九、包

包是函數和數據的集合,將有相關特性的函數和數據放在統一的文件/目錄進行管理,每個包都可以作爲獨立的單元維護並提供給其他項目進行使用

1. 聲明

Go 源文件都需要在開頭使用 package 聲明所在包,包名告知編譯器哪些是包的源代碼用於編譯庫文件,其次包名用於限制包內成員對外的可見性,最後包名用於在包外對公開成員的 訪問 包名使用簡短的小寫字母,常與所在目錄名保持一致,一個包中可以由多個 Go 源文件,但 必須使用相同包名
在這裏插入圖片描述

2. 導入&調用

在使用包時需要使用 import 將包按路徑名導入,再通過包名調用成員可通過 import 每行導入一個包,也可使用括號包含所有包並使用一個 import導入
在這裏插入圖片描述
工作目錄結構說明:
⚫ bin: 用於放置發佈的二進制程序
⚫ pkg: 用於放置發佈的庫文件
⚫ src: 用於放置源代碼
編譯&運行
須在GOPATH中添加你的開發目錄
⚫ 使用 go build 編譯二進制文件
命令:go build gpkgmain
說明:編譯路徑 testmain 下的包,main 包,則在當前目錄產生以 testmain 命名的 二進制程序
⚫ 使用 go run 運行二進制文件
命令:go run testmain
⚫ 使用 go install 編譯併發布二進制文件
命令:go install testmain
說明:編譯併發布路徑 testmain 下的包,main 包,則在將編譯後的以 testmain 命名的二進制程序拷貝到 bin 目錄
⚫ 使用 go install 編譯發佈庫文件
命令:go install github.com/gopkg
說明:編譯併發布路徑 github.com/gopkg 下的包,非 main 包,則在將編譯的以包名
命名的庫文件拷貝到 pkg/GOOS_GOARCH 目錄下
⚫ 使用 go install 編譯發佈所有二進制和庫文件
命令:go install ./…
說明:編譯併發布當前路徑下的所有二進制程序和庫文件
注意:Go 語言不允許交叉導入包

3. 導入形式

  1. 絕對路徑導入
    在 GOPATH 目錄中查找包
    示例:
    ⚫ import “fmt”
    ⚫ import “gpkgname/pkg01”
  2. 相對路徑導入
    在當前文件所在的目錄查找
    示例:import “./gpkgname/pkg02”
  3. 點導入
    在調用點導入包中的成員時可以直接使用成員名稱進行調用(省略包名)
  4. 別名導入
    當導入不同路徑的相同包名時,可以別名導入爲包重命名,避免衝突
  5. 下劃線導入
    Go 不允許包導入但未使用,在某些情況下需要初始化包,使用空白符作爲別名進行導入,從而使得包中的初始化函數可以執行
    在這裏插入圖片描述

4. 成員可見性

Go 語言使用名稱首字母大小寫來判斷對象(常量、變量、函數、類型、結構體、方法等)的訪問權限,首字母大寫標識包外可見(公開的),否者僅包內可訪問(內部的)如果首字母不是大寫那麼在調用包內函數或者變量等等會報錯,只是自己包內引用可以小寫

5. main 包與 main 函數

main 包用於聲明告知編譯器將包編譯爲二進制可執行文件
在 main 包中的 main 函數是程序的入口,無返回值,無參數

6. init 函數

init 函數是初始化包使用,無返回值,無參數。建議每個包只定義一個。init 函數在 import
包時自動被調用(const->var->init)
在這裏插入圖片描述

7. Go 包管理

1) 介紹
Go1.11 版本提供 Go modules 機制對包進行管理,同時保留 GOPATH 和 vendor 機制,使用臨時環境變量 GO111MODULE 進行控制,GO111MODULE 有三個可選值:
a) 當 GO111MODULE 爲 off 時,構建項目始終在 GOPATH 和 vendor 目錄搜索目標程序依賴包
b) 當 GO111MODULE 爲 on 時,構建項目則始終使用 Go modules 機制,在 GOPATH/pkg/mod
目錄搜索目標程序依賴包
c) 當 GO111MODULE 爲 auto(默認)時,當構建源代碼不在 GOPATH/src 的子目錄且包含
go.mod 文件,則使用 Go modules 機制,否則使用 GOPATH 和 vendor 機制
2) GOPATH+vendor 機制
a) vendor
將項目依賴包拷貝到項目下的 vendor 目錄,在編譯時使用項目下 vendor 目錄中的包進
行編譯
解決問題:
⚫ 依賴外部包過多,在使用第三方包時需要使用 go get 進行下載
⚫ 第三方包在 go get 下載後不能保證開發和編譯時版本的兼容性
b) 包搜索順序
⚫ 在當前包下的 vendor 目錄查找
⚫ 向上級目錄查找,直到 GOPATH/src/vendor 目錄
⚫ 在 GOPATH 目錄查找
⚫ 在 GOROOT 目錄查找
c) 第三方包
可以藉助 go get 工具下載和安裝第三方包及其依賴,需要安裝與第三方包匹配的代碼
管理工具,比如 git、svn 等
使用方法:
常用參數:
⚫ -d:僅下載依賴包
⚫ -u:更新包並安裝
⚫ -x:打印執行的命令
⚫ -v:打印構建的包
⚫ -insecure:允許使用 http 協議下載包
第三方包查找地址:
⚫ https://godoc.org
⚫ https://gowalker.org/
3) Go modules 機制
a) 優勢:
⚫ 不用設置 GOPATH,代碼可任意放置
⚫ 自動下載依賴管理
⚫ 版本控制
⚫ 不允許使用相對導入
⚫ replace 機制
b) 初始化模塊
命令:go mod init test
在這裏插入圖片描述
c) 當前模塊下的包
對於當前模塊下的包導入時需要使用 modname+packagename
在這裏插入圖片描述
d) 第三方包
在使用 go mod tidy、go build、go test、go list 命令會自動將第三方依賴包寫入到
go.mod 文件中同時下載第三方依賴包到 GOPATH/pkg/mod/cache 目錄,並在當前模塊目
錄生成一個構建狀態跟蹤文件 go.sum,文件中記錄當前 module 所有的頂層和間接依賴,
以及這些依賴的校驗和
e) 常用命令
⚫ go mod tidy:整理依賴模塊(添加新增的,刪除未使用的)
⚫ go mod vendor: 將依賴模塊拷貝到模塊中的 vendor 目錄
⚫ go build: 編譯當前模塊
⚫ go build ./…: 編譯當前目錄下的所有模塊
⚫ go build -mod=vendor:使用當前模塊下的 vendor 目錄中的包進行編譯
⚫ go mod download: 僅下載第三方模塊
⚫ go mod grapha: 打印所有第三方模塊
⚫ go list -m -json all:顯示所有模塊信息
⚫ go mod edit: 修改 go.mod 文件
-require=pakcage@version
-replace=old_package@version=new_package@version
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章