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