关于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即可。最终生成的文件如下:

image-20230620001750112

utils也必须生成go.mod

调用方法如下:

  • service调用utils
    image-20230620002035747
  • main调用service

    image-20230620002125801

附:最终实现的文件结构如下:

//src下的文件结构
│  go.mod
│  main.go
│
├─service
│      go.mod
│      userservice.go
│
└─utils
        go.mod
        userhelper.go

image-20230619235910586

二、另一种方式是通过go.work来实现

其实还是要写replace,只不过换成了go.work文件,命令为go work init `。src根目录生成的go.work文件如下(跟上面的项目文件不同,仅供参考)。

image-20230620002713695

然后其它地方调用完全一样,这里就不再详细说明了,可参考上文操作。

网上很多教程写得不够完整,甚至有的还误导人!
none
最后修改于:2023年07月11日 11:31

评论已关闭