Go Mod/Module 学习

本文介绍了Go语言中如何使用go mod初始化模块,管理依赖,包括添加、更新和查看依赖。通过`go mod init`创建go.mod文件,`go get`下载和更新依赖,`go list -m all`列出所有依赖。还提到了主版本号的处理,以及如何在代码中切换不同主版本号的依赖。最后,总结了常用go mod命令的作用。
摘要由CSDN通过智能技术生成

Links:

Go Modules Reference - The Go Programming Language

Using Go Modules - The Go Programming Language


Go 使用模块名初始化模块

$ go mod init example.com/hello
go: creating new go.mod: module example.com/hello
go: to add module requirements and sums:
        go mod tidy

上述命令创建了一个go.mod文件。

添加依赖

原博客说执行go test时会自动下载依赖,但我测试后不行。

$ go env -w GOPROXY=https://goproxy.cn,direct
$ go test
hello.go:3:8: no required module provides package rsc.io/quote; to add it:
        go get rsc.io/quote

通过 go get 会从源码中自动搜索所有依赖并下载,

$ go env -w GOPROXY=https://goproxy.cn,direct
$ go get
go: downloading rsc.io/quote v1.5.2
go: downloading rsc.io/sampler v1.3.0
go: downloading golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c
go: added golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c
go: added rsc.io/quote v1.5.2
go: added rsc.io/sampler v1.3.0
$ cat go.mod
module example.com/hello

go 1.18

require rsc.io/quote v1.5.2

require (
        golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c // indirect
        rsc.io/sampler v1.3.0 // indirect
)

在 go.mod 的第4行是直接依赖,后面的 // indirect 是间接依赖。在旧版的 go 中不显示间接依赖?

可以通过 go list -m all 列出当前模块和所有依赖。

$ go list -m all
example.com/hello
golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c
rsc.io/quote v1.5.2
rsc.io/sampler v1.3.0

第一行是当前模块,也称为主模块。后面的是依赖,依赖包含名称和版本号,第一个依赖是伪版本号,后面的是正常的语义版本标签。

go.sum 中包含了模块的哈希值。

更新依赖

$ go get golang.org/x/text
go: downloading golang.org/x/text v0.3.7
go: upgraded golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c => v0.3.7

相当于go get golang.org/x/text@latest

通过 go list 列出模块的所有版本,然后将latest换成需要的版本:

$ go list -m -versions rsc.io/sampler
rsc.io/sampler v1.0.0 v1.2.0 v1.2.1 v1.3.0 v1.3.1 v1.99.99

使用不同主版本号的依赖

在添加依赖 rsc.io/quote/v3 之后,通过 go list -m 列出模块(可以使用…通配符)

$ go list -m rsc.io/...
rsc.io/quote v1.5.2
rsc.io/quote/v3 v3.1.0
rsc.io/sampler v1.3.0

每个主版本号都要使用不同的模块路径:从v2开始,模块路径必须以版本号结尾,因为不同的主版本号不兼容。

更新依赖到新的主版本号

package hello

import "rsc.io/quote/v3"

func Hello() string {
    return quote.HelloV3()
}

func Proverb() string {
    return quote.Concurrency()
}

即使导入了 quote/v3,还可以在代码中使用 quote 这个名称。

总结

  • go mod init creates a new module, initializing the go.mod file that describes it.
  • go build, go test, and other package-building commands add new dependencies to go.mod as needed.
  • go list -m all prints the current module’s dependencies.
  • go get changes the required version of a dependency (or adds a new dependency).
  • go mod tidy removes unused dependencies.

GOPATH 是需要设置的,如果不设置默认是 ~/go

go 安装在 /usr/local/go

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值