【Golang】go mod的使用

【1】GO111MODULE有三个值:off, on, auto

off:go命令行将不会支持module功能,将会使用旧版本那种通过vendor目录或者GOPATH来查找依赖包的方式。

on:go命令行会使用modules功能,而不再去GOPATH目录下查找依赖包。

auto(默认值):go命令行将会根据当前目录来决定是否启用module功能。在以下两种情形下使用module功能:a、当前目录在GOPATH/src之外,且该目录包含go.mod文件;b、当前文件在包含go.mod文件的目录下面。

【2】初始化模块:

go mod init whz_test(模块名称)

在当前目录会生产一个go.mod文件,同时还有一个go.sum文件。

go.mod和go.sum都应该加入到版本控制,但go.sum不需要手工维护。

子目录是不需要go mod init的,所有子目录中的依赖都会组织在根目录的 go.mod 文件中。

创建go.mod文件后,直接go run 或 go build 将会自动下载依赖包,并将依赖关系和版本写到go.mod和go.sum文件中。

【3】其他命令:

go mod download: 下载依赖包

go mod graph: 打印模块依赖图

go mod tidy: 拉取缺少的模块,移除不用的模块

go mod vendor: 将依赖复制到vendor下

go mod verify: 验证依赖是否正确

go mod why: 解释为什么需要依赖

【4】go.mod文件中支持4个命令:

module语句指定包的名称(即路径)

require语句指定依赖项模块

replace语句可以替换依赖项模块:不包含某个版本等

exclude语句可以忽略依赖项模块:排除一个特定的模块依赖,用此指明不拉取该版本

【5】举例:go.mod文件内容


module whz_test

go 1.19

require (

github.com/hashicorp/go-multierror v1.1.1

...

github.com/samber/lo v1.37.0

)

require (

github.com/hashicorp/errwrap v1.0.0 // indirect

github.com/modern-go/reflect2 v1.0.2 // indirect

golang.org/x/exp v0.0.0-20220303212507-bbda1eaf7a17 // indirect

)

exclude golang.org/x/time v0.3.0

replace golang.org/x/sync v0.1.0 => gitee.com/x/sync v0.1.0

replace golang.org/x/sync v0.1.0 => /User/local/...


[说明]

(1)在require语句间接引入的,会有indirect标识;

(2)replace语句可解决:对应依赖模块网络问题拉取不到,换个地方拉取;本地调试,不想发布到仓库。

【6】go.mod文件生产后,拉取指定的依赖,常用的命令:

go get 只拉取(更新)直接依赖

go get -u 拉取(更新)直接依赖和间接依赖模块

go get -u -t ./... 拉取(更新)直接依赖和间接依赖模块,包括单元测试中用到的。

(go get拉取依赖不需要精准指定依赖版本,可自动推断对应的版本号)

拉取指定版本的命令:

go get http://golang.org/x/text@latest 拉取最新的版本,若存在tag,则优先使用。

go get http://golang.org/x/text@master 拉取 master 分支的最新 commit。

go get http://golang.org/x/text@v0.3.2 拉取 tag 为 v0.3.2 的 commit。

go get http://golang.org/x/text@342b2e 拉取 hash 为 342b231 的 commit,最终可能转换为 v0.3.2。

【7】go mod模式下,goland可能会出现的问题:

使用go mod下载了指定的依赖后,在goland中提示错误,无法关联到这个依赖,不过在goland以及命令行都可以编译运行。

goland版本:2024.2.

检查goland的设置:

(1)在File->Settings设置了Global GOPATH使用了系统的环境变量:

[GOPATH]C:\whz_go_path

(2)使用go mod下载了依赖包:github.com/gin-gonic/gin

经检查,已经成功安装到了GOPATH路径了:

C:\whz_go_path\pkg\mod\github.com\gin-gonic\gin@v1.10.0

(3)在命令行编译成功,在goland中也可以编译运行成功,但是代码中main.go显示红色波浪线,提示有错误,无法解析依赖库"github.com/gin-gonic/gin"。

(4)经检查,是因为File->Settings->Go->GoModules设置中没有勾选以下选项:

Enable Go modules integration

勾选后问题解决。

相关推荐
汉克老师2 分钟前
GESP4级考试语法知识(贪心算法(四))
开发语言·c++·算法·贪心算法·图论·1024程序员节
爱吃生蚝的于勒41 分钟前
C语言最简单的扫雷实现(解析加原码)
c语言·开发语言·学习·计算机网络·算法·游戏程序·关卡设计
Ai 编码助手1 小时前
Go语言 实现将中文转化为拼音
开发语言·后端·golang
hummhumm1 小时前
第 12 章 - Go语言 方法
java·开发语言·javascript·后端·python·sql·golang
hummhumm1 小时前
第 8 章 - Go语言 数组与切片
java·开发语言·javascript·python·sql·golang·database
何曾参静谧1 小时前
「QT」文件类 之 QDir 目录类
开发语言·qt
何曾参静谧1 小时前
「QT」文件类 之 QTemporaryDir 临时目录类
开发语言·qt
杜杜的man1 小时前
【go从零单排】Directories、Temporary Files and Directories目录和临时目录、临时文件
开发语言·后端·golang
qq_308957471 小时前
Gin 框架入门(GO)-1
开发语言·golang·gin
wywcool1 小时前
JVM学习之路(5)垃圾回收
java·jvm·后端·学习