go package、import、go.mod 理解 以及 私有包引入

前言

相信很多剛學go的同學都被這幾個搞得一頭霧水,我也是。。。現在理解了之後寫下這篇文章,如果有什麼不正確的地方希望能夠指出一定改正哈哈哈…

詳解

當項目中有 go.mod 時,使用 go modules 管理,反之使用 舊的 GOPATH 和 vendor機制。這裏針對的是含go.mod的項目

package、import、go.mod

1.package是Go中用於包聲明語句的關鍵字。如果是命令源碼文件的話必須是main,但如果不是的話可以隨便取,但是最好最好最好是和目錄名一致! 這樣方便定位以及使用

關於package的最佳實踐:
package is folder.
package name is folder name.
package path is folder path.

2 . import引入的私有包的名字可以隨意取(因爲可以用replace代替,後面會講),但是最好和引入包的目錄名字相同,方便定位以及使用。引入公共包時,必須 要類似 github.com/yourname/xxx,gitee.com/yourname/xxx這種,否則編譯的時候會找不到包!

3 . 被引入的其他項目的包,必須要存在 go.mod文件,否則編譯時會提示
go: [email protected]: parsing ..\..\proj2\go.mod: open c:\go_work\github.com\xxx\proj2\go.mod: The system cannot find the file specified.
爲什麼必須要go.mod文件呢?
因爲你引入的這個包,可能還引入了其他的包,而這些被引入的其他的包及其版本信息都會記錄在go.mod中,這樣在編譯時就能通過這個go.mod來拉取其他被引用的包。通過重用 go.mod 文件實現按版本維護這些直接和間接依賴

4 . 之前沒有 go modules時,import可以使用相對路徑,例如

import (
	"./vendor"
)

這樣寫之後 編譯時 會去 $GOPATH/src中查找文件。
如果在含有go.mod不允許使用相對路徑!!!

5 . 生成go.mod的命令如下

go mod init xxx

xxx是模塊的命名,xxx就是我們說的項目依賴路徑,通常來說該地址就是項目的倉庫地址,所有需要引用項目包的地址都填寫這個地址,無論是內部之間引用還是外部引用。
也即是說,在項目 啓用了 go modules 之後,引用包必須跟 go mod 文件第一行包名一樣,

私有包引入步驟

分爲三種情況:

第一種:被引入.go文件和引入.go文件處於同一項目,同一目錄下

舉個特別點的例子
假設現在 兩個文件 go1.go , go2.go 在 project 根目錄下
go1.go 和 go2.gopackage 都應當是 main
這個時候加入go1.go想引入 go2.go中的good()函數,只需要
直接 good() 即可 (這其實就相當於他們都在同一個類裏,只不過不同的方法)
在編譯時,一定要記得是  go build *.go 否則會提示

command-line-arguments
.\go1.go:10:2: undefined: good

第二種:被引入.go文件和引入.go文件處於同一項目不同目錄下

假設現在 兩個文件 go1.go 在 project/logs 目錄下 , go2.go 在 project/utils 目錄下
這個時候假如go1.go想引入 go2.go中的Good()函數,只需要
import "project的模塊名加目標package名 例如 github.com/xxx/project/utils"
//最後直接引用即可
utils.Good()

導入這個包的地方是 模塊內的絕對路徑,就是要從go.mod所在的目錄開始。

第三種:被引入.go文件和引入.go文件處於不同項目

假設現在 兩個文件 go1.go 在 project1 目錄下 , go2.go 在 project2 目錄下
這個時候加入go1.go想引入 go2.go中的Good()函數,只需要
import "project2"

然後在 project1的 go.mod 中添加
require project2 v.0.0.0
replace project2 => c:/project2 //這一步是引入本地的某個項目,如果是github上的話不需要replace

//最後直接引用即可
project2.Good()
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章