# 模块管理/module maintenance

前面说到了 package 是 Go 中的一个基础单位。但当我们开发一个应用时,一定会用到很多 package,此时,如果管理 package 就成了一个问题了。

# go mod

go 提供了一个模块管理命令。

go mod xxx

可以执行帮助命令获取,命令详细信息

go help mod

# 创建模块

我们可以在希望创建为模块的路径下执行以下命令:

go mod init 【module名称】
# 也可以省略module名称,如果省略会默认使用当前文件夹名
go mod init

执行之后,当前目录下会创建一个go.mod文件,内容如下:

module {{ module名称 }}

go {{ golang版本 }}

# 引用第三方 package

如果只用 Go 的基础库,那么只需在代码中直接import即可。但如果用到第三方库,我们需要先从外网下载库,并使用。

# 从公共库搜索 package

Go 提供了一个官方 packages 库,我们可以在上面搜索需要的 package。地址:https://pkg.go.dev/ (opens new window)
搜索到结果之后,可以点击进入查看 package 的文档。如果确认使用该 package,可以复制文档页顶部提供的复制按钮。如我现在要引用的是quote包,复制得到的结果为:

rsc.io/quote/v4

# 引用方法 1:先 import

接下来,我们可以正式引用这个 package 了。其中一个方法是先在代码中import该 package

import "rsc.io/quote/v4"

然后执行命令

go mod tidy

执行命令之后,Go 会扫描当前模块下的所有代码找到 import。如果 import 引用到的 package 没有在go.mod中注明,会帮我们自动写入go.mod并下载。相反如果go.mod中注明的 package,在代码中没有用到,就会在go.mod中去除。
执行后可以看到go.mod中多了下列内容:

require (
   rsc.io/sampler v1.3.0 // indirect
)

并且同目录下多了一个go.sum文件,这个文件记录了 hellomodule 的直接依赖和间接依赖包的相关版本的 hash 值,用来校验本地包的真实性。在构建的时候,如果本地依赖包的 hash 值与 go.sum 文件中记录的不一致,就会被拒绝构建。

# 引用方法 2:先下载 package

你也可以反过来,先在go.mod中注明需要用到的 package。

//go.mod
require rsc.io/quote/v4 v4.0.1

执行命令下载依赖

go get -u -v

执行之后会下载依赖,然后在对应的代码中import即可。

# 模块运行

运行模块的命令为:

go run .

注意,运行模块时,入口必须为 package main。 执行后,go 会自动搜索 main 入口,并运行程序。