关于golang引用本地其他包的坑
warning:
这篇文章距离上次修改已过501天,其中的内容可能已经有所变动。
关于go引用本地其他包的坑
初学golang,对go的包管理很不适应,甚至踩了个大坑。主要是在同一个项目,不同包名要相互调用时遇到的。
如果用其他语言,要么命名空间,要么包名识别,都可以很好的实现跨包访问对应类的方法,但是,在go里,必须使用replace来实现。经过一段时间的摸索,目前知道有两种方式可以解决。
一、通过go.mod实现
在src根目录(main.go同级目录),go mod init 包名随便写,生成go.mod。在生成的文件中添加require及replace信息。
module nobody
require (
jd.com/service v1.0.0
jd.com/utils v1.0.0
)
//假装存在jd.com/utils这个远程包,用replace重定向到真正需要的包
replace "jd.com/utils" v1.0.0 => "./utils"
replace "jd.com/service" v1.0.0 => "./service"
go 1.20
==另外两个包也要生成go.mod==,这里拿service来举例,在service根目录下,go mod init service即可。最终生成的文件如下:
utils也必须生成go.mod
。
调用方法如下:
- service调用utils
main调用service
附:最终实现的文件结构如下:
//src下的文件结构
│ go.mod
│ main.go
│
├─service
│ go.mod
│ userservice.go
│
└─utils
go.mod
userhelper.go
二、另一种方式是通过go.work来实现
其实还是要写replace,只不过换成了go.work文件,命令为go work init `。src根目录生成的go.work文件如下(跟上面的项目文件不同,仅供参考)。
然后其它地方调用完全一样,这里就不再详细说明了,可参考上文操作。
网上很多教程写得不够完整,甚至有的还误导人!
评论已关闭