目錄
GOPATH
go install指令
govendor
go mod
配置
GO111MODULE介紹
指令
使用
GOPROXY介紹
項目目錄
代碼
運作截圖
遠端包
go get指令
參考
GOPATH
- 代碼開發必須在go path的src目錄下
- 手動管理依賴
- 依賴包沒有版本
全是缺點,在本地可以湊合用用
go install指令
goinstall和中Go-常用指令go的使用(build、env、run、fmt等)的go build很類似。go install 隻是将編譯的中間檔案放在GOPATH的 pkg 目錄下,以及固定地将編譯結果放在 GOPATH 的 bin 目錄下。
這個指令在内部實際上分成了兩步操作:
- 第一步是生成結果檔案(可執行檔案或者 .a 包)
- 第二步會把編譯好的結果移到 $GOPATH/pkg 或者 $GOPATH/bin。
govendor
- 解決了包依賴,一個配置檔案即可管理
- 依賴包全都下載下傳到項目vendor下,每個項目都有一份
大型項目也不行,備援太多
指令 | 功能 |
---|---|
| 初始化 vendor 目錄 |
| 列出所有的依賴包 |
| 添加包到 vendor 目錄,如 govendor add +external 添加所有外部包 |
| 添加指定的依賴包到 vendor 目錄 |
| 從 $GOPATH 更新依賴包到 vendor 目錄 |
| 從 vendor 管理中删除依賴 |
| 列出所有缺失、過期和修改過的包 |
| 添加或更新包到本地 vendor 目錄 |
| 本地存在 vendor.json 時候拉去依賴包,比對所記錄的版本 |
| 類似 目錄,拉取依賴包到 vendor 目錄 |
go mod
- 一個包可以由多個檔案組成
- 同一包内不需要導入
配置
GO111MODULE介紹
有三個值:off, on和auto(預設值)。
GO111MODULE=off,go指令行将不會支援module功能,尋找依賴包的方式将會沿用舊版本那種通過vendor目錄或者GOPATH模式來查找。
GO111MODULE=on,go指令行會使用modules,而不會去GOPATH目錄下查找。
GO111MODULE=auto,預設值,go指令行将會根據目前目錄來決定是否啟用module功能。這種情況下可以分為兩種情形:
目前目錄在GOPATH/src之外且該目錄包含go.mod檔案
目前檔案在包含go.mod檔案的目錄下面
指令
指令 | 說明 |
---|---|
download | 下載下傳依賴包 |
edit | 編輯go.mod |
graph | 列印子產品依賴圖 |
init | 初始化一個新子產品到目前目錄 |
verify | 在目前目錄初始化mod |
tidy | 拉取缺少的子產品,移除不用的子產品 |
vendor | 将依賴複制到vendor下 |
verify | 驗證依賴是否正确 |
why | 解釋為什麼需要依賴 |
使用指令
根目錄下生成go.mod檔案
go mod init "包名"
使用
GoLand
GOPROXY介紹
Proxy,對應GOPROXY環境變量
proxy.golang.org,中國無法通路,除非你有梯子
goproxy.cn、goproxy.org可以在中國使用,“direct” 是一個特殊訓示符,用于訓示 Go 回源到子產品版本的源位址去抓取(GitHub等),當值清單中上一個 Go 子產品代理傳回 404 或 410 錯誤時,Go 自動嘗試清單中的下一個,遇見 “direct” 時回源,也就是回到源位址去抓取,而遇見 EOF 時終止并抛出 “invalid version: unknown revision...” 的錯誤。
項目目錄
- add.go中有可導出的函數Add
- plus.go中使用add.go中的函數Add,來展示同一包内不需要導入
- sub.go中使用plus.go中的Plus函數,來展示不同包下如何導入
- Cal.go是入口檔案,package後必須是main,同時含有main方法,導入了包plus和sub
代碼
add.go
package plus
func Add(a,b int)int{
return a+b
}
plus.go
package plus
func Plus(a,b int)int{
return Add(a,b)
}
相同包直接使用
sub.go
package sub
import "modUse/plus"
func Sub(a,b,c int) int{
return plus.Plus(a,b) - c
}
不同包需要導入
Cal.go
package main
import (
"fmt"
"modUse/plus"
"modUse/sub"
)
func main() {
a := 10
b := 20
fmt.Println(plus.Plus(a,b))
fmt.Println(sub.Sub(a,b,5))
}
main包中導入。使用go mod不用建立main目錄,寫上package main即可。
運作截圖
編譯後運作即可,go run 也行。
遠端包
go get指令
使用
go get [-d] [-t] [-u] [-v] [-insecure] [build flags] [packages]
配置好代理,Go-常用指令go的使用(build、env、run、fmt等)中講解env時有代理的設定。
遠端包格式如下
- 網站域名:表示代碼托管的網站,github、gitee等
- 作者或機構:表明這個項目的歸屬,一般為網站的使用者名。
- 項目名:每個網站下的作者或機構可能會同時擁有很多的項目,圖中标示的部分表示項目名稱。
我寫了一個簡單的go包,實作了單連結清單:Go-如何優雅的實作單連結清單?(含全部代碼)
包的網址為:https://gitee.com/frankyu365/datastructure
最新版
go get example.com/pkg
指定版本
go get example.com/[email protected]版本号
删除依賴并降級
go get example.com/[email protected]
更新具體的包
go get -d golang.org/x/net
選項 | 含義 |
---|---|
-v | 顯示操作流程的日志及資訊,友善檢查錯誤 |
-u | 下載下傳丢失的包,但不會更新已經存在的包 |
-d | 隻下載下傳更新,不安裝,安裝使用go install |
-insecure | 允許使用不安全的 HTTP 方式進行下載下傳操作 |
我一般使用-u -v參數
go get -u -v gitee.com/frankyu365/datastructure
Cal.go改為
package main
import (
"fmt"
"modUse/plus"
"modUse/sub"
"gitee.com/frankyu365/datastructure/singlelist"
)
func main() {
a := 10
b := 20
fmt.Println(plus.Plus(a,b))
fmt.Println(sub.Sub(a,b,5))
lst := singlelist.New()
lst.PushBack(7)
fmt.Println(lst.Front())
}
這個時候的go.mod就自動添加了子產品
你可以在你的GOPATH下找到這個包
運作結果
問題
go mod緩存
參考:go module @latest found but does not contain package
釋出自己的go包
建立項目
go mod init "xxx.com/username/packagename"
寫代碼
添加到本地倉庫
git add .
添加注釋
git commit -m ''
添加标簽
git tag -a <版本号> -m "<備注資訊>"
釋出
git push --tags origin branch
參考
go指令-指令go
更多Go相關内容:Go-Golang學習總結筆記
有問題請下方評論,轉載請注明出處,并附有原文連結,謝謝!如有侵權,請及時聯系。如果您感覺有所收獲,自願打賞,可選擇支付寶18833895206(小于),您的支援是我不斷更新的動力。