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


當項目中有 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: proj666@v0.0.0: 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"
)
1
2
3
這樣寫之后 編譯時 會去 $GOPATH/src中查找文件。
如果在含有go.mod不允許使用相對路徑!!!

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

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

私有包引入步驟
分為三種情況:
第一種:被引入.go文件和引入.go文件處於同一項目,同一目錄下
舉個特別點的例子
假設現在 兩個文件 go1.go , go2.go 在 project 根目錄下
go1.go 和 go2.go 的 package 都應當是 main
這個時候加入go1.go想引入 go2.go中的good()函數,只需要
直接 good() 即可 (這其實就相當於他們都在同一個類里,只不過不同的方法)
在編譯時,一定要記得是 go build *.go 否則會提示

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

1
2
3
4
5
6
7
8
9
10
第二種:被引入.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()
1
2
3
4
5
導入這個包的地方是 模塊內的絕對路徑,就是要從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
//最后直接引用即可
project2.Good()
————————————————
版權聲明:本文為CSDN博主「johopig」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/zhetmdoubeizhanyong/article/details/100569182


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM