Go 语言入门指南:聊聊GoModule的几种操作 | 青训营

190 阅读2分钟

前言:

Go 程序由 Go 包组合而成的,Go 程序的构建过程就是确定包版本、编译包以及将编译后得到的目标文件链接在一起的过程, Go 语言的构建模式历经了三个迭代和演化过程,分别是最初期的 GOPATH、1.5 版本的 Vendor 机制,以及 Go Module,而对于module模式,只需要简单的go mod命令就可以成为一个go module项目,极大地方便了我们管理包的过程。

现在,我们就最新的Go Module构建模式,聊聊几种它的常用操作。

为当前 module 添加一个依赖

场景:在我们开发项目时,我们会经常为项目引入第三方包,并借助这些包完成特定功能,那么如何使用go module引入这些第三方依赖呢?

我们以常用的第三方库,zap日志库为例:

image.png

直接引入zap库,会发现zap依赖已经爆红,运行会出现依赖没有添加的错误,并提示用 go get 添加

image.png

我们使用 go get 命令手动引入依赖,在go.mod里新增了zap依赖,版本为v1.25.0

require ( go.uber.org/multierr v1.10.0 // indirect go.uber.org/zap v1.25.0 // indirect )

如果依赖项有很多,我们可以直接使用 go mod tidy 命令一步到位,跟手动 go get 效果一样。

升级 / 降级依赖的版本

场景:开发过程中,当我们直接使用go mod tidy会自动引入最新依赖,可能会对不兼容之前的项目,这时候就需要对依赖进行升级或者降级。

先说明一下,go module采用语义版本规范,格式为 vX.Y.Z X为主版本号,Y为次版本号,Z是补丁版本。主版本号相同的,新版本会兼容旧版本,但主版本不同,可能会不向下兼容。

还是以zap为例:

使用 go list -m -versions go.uber.org/zap , 查看zap版本号,如图:

image.png

假设我们要对当前版本进行降级到1.22.0

这时,使用命令:go get go.uber.org/zap@v1.22.0

image.png

如果再进行升级到1.23.0

使用相同的命令即可:go get go.uber.org/zap@v1.23.0

image.png

image.png

会发现,go.mod里为我们最新引入的版本。

注意,go module对于主版本号为1或0的,无需加版本信息,但如果大于1,就需要在包路径上加入版本路径,如引入go-redis:

image.png

使用go mod tidy命令

移除一个依赖

移除一个依赖很简单,一般在智能代码编辑器,如goland 或 vscode中直接 Ctrl+S 保存即可自动移除依赖,或者使用强大的 go mod tidy 一步到位。

特殊情况:使用 vendor

场景:主要是在一些不方便访问外部网络的环境下,需要用到vender作为module补充。

使用 go mod vender 创建

对于空导入说明

空导入是指,在依赖包前加一个 _ 项目不会用到里面的库,但是会执行里面的 init 函数。

Snipaste_2023-08-19_10-09-26.png