本专栏文章持续更新,新增内容使用蓝色表示。
Go Path
Go 语言早期的 GOPATH 模式存在几个明显的弊端:
版本控制缺失
-
强制下载最新版本,无法 通过指令拉取特定版本
-
无法保证 团队间第三方依赖版本的一致性
-
无法锁定项目引用的第三方版本,影响 项目的完整性 和安全性
Go Modules
从 Go 1.11 版本开始,官方引入了 Go Modules作为新的依赖管理方案。
首先检查你的 Go 版本是否支持:
bash
go version
查看 Go Modules 相关命令:
bash
go mod help
Go mod
环境变量
可使用 go env 查看环境变量
bash
go env
设置环境变量的方法,以 GOPROXY 为例
bash
# 临时生效(当前终端会话)
# 命令行输入 export 命令(Linux/Mac)
export GOPROXY=https://goproxy.cn,direct
# 永久设置环境变量
# 写入Go配置【推荐】
go env -w GOPROXY=https://goproxy.cn,direct
# 在当前用户的环境变量中添加
vim ~/.bashrc
export GOPROXY=https://goproxy.cn,direct
GO111MODULE
Go 语言在 1.11 版本引入的一个环境变量,用于控制 Go 的依赖管理系统。有以下三个可选值:
-
auto(默认值):在 GOPATH 外或项目包含 go.mod 时启用 Go Modules
-
on:强制启用 Go Modules,完全基于 go.mod 管理依赖
-
off:强制禁用,使用传统 GOPATH 模式
可通过 go env -w 进行调整
bash
go env -w GO111MODULE=on
也可以通过上述添加用户环境变量的方法进行设置。
GOPROXY
设置 Go 模块代理服务器,使 Go 工具链在下载依赖包时通过镜像站点加速获取过程,以配置七牛云的代理 https://goproxy.cn 为例。
bash
go env -w GOPROXY=https://goproxy.cn,direct
后面的 direct 表示当代理无法提供该模块时,会回退到 direct 模式(直接从源站如 GitHub、GitLab 下载)。
GOSUMDB
Go checksum database ,Go 模块的校验和数据库,用于保证所拉取的模块版本数据完整性,防止被篡改。如果校验不通过,Go 会立即中止构建过程。设置了 GOPROXY 后,Go 会默认从配置的代理服务器获取校验和值。
工作流程:
1)下载模块时,Go 会计算 该模块的SHA-256 哈希值
2)向指定路径中查询 该模块版本的官方校验和
3)比对结果:
-
一致:验证通过,继续构建
-
不一致:报错中止,提示可能存在篡改
GONOPROXY/CONOSUMDB/GOPRIVATE
表示含义相近,一般配置 GOPRIVATE 即可,其他两个变量会被默认覆盖。使用场景使用私有库。
bash
go env -w GOPRIVATE="<私有仓库>"
初始化 Go Modules 项目
首先确保开启 Go Modules 模块,go env -w GO111MODULE=on。
创建项目
创建一个测试的文件夹:
bash
# 不再需要在 GOPATH/src 下创建项目
mkdir -p tree/modules_test
cd tree/modules_test
初始化模块
初始化 Go Modules 模块:
bash
go mod init <当前项目的模块名称>
go mod init modules_test
会生成一个 go.mod 文件,共包含两行,一个是模块名称,另一行是当前编译器的版本号。

初始化完成后,就可以正常写项目代码了。
管理依赖
编写代码后,依赖会自动处理:
bash
# 手动下载依赖
go get github.com/example/package
# 或通过运行自动下载
go run main.go
如果源代码中依赖某个库,可以通过 go get (默认down 最新的)手动 down ,也可以执行 go run 时自动 down。最终 go.mod 文件中会添加新代码 。
bash
require <模块名 版本号>
// indirect 表示间接依赖
require <模块名 版本号> // indirect
它会生成一个 go.sum 文件,它的作用是罗列当前项目直接或间接的依赖所有模块版本,确保依赖版本的完整性。
bash
<模块名 版本号> h1:hash
<模块名 版本号>/go.mod h1:hash
这个文件一般不能被手动修改,其中 h1:hash 表示项目整体的 zip 文件打开之后的全部文件的校验和来生成的 hash,如果不存在,可能表示依赖的库可能用不上。
go.mod h1:hash 表示对 go.mod 文件做的 hash。
修改项目依赖关系
bash
go mod edit -replace=<原版本>=<新版本>
go.mod 文件就会被修改(多一行 replace)。
【补充】Go Modules 命令速查表
已下内容仅作为补充,"初始化 Go Modules 项目"中的几个命令比较常用。
基础命令
| 命令 | 说明 | 示例 |
|---|---|---|
go mod init |
初始化新模块 | go mod init github.com/user/project |
go mod tidy |
添加缺失和删除未使用的依赖 | go mod tidy |
go mod download |
下载依赖到本地缓存 | go mod download |
go mod vendor |
创建vendor目录 | go mod vendor |
go mod verify |
验证依赖完整性 | go mod verify |
go mod graph |
显示模块依赖图 | go mod graph |
go mod why |
解释为什么需要依赖 | go mod why -m package |
依赖管理命令
| 命令 | 说明 | 示例 |
|---|---|---|
go get |
添加/更新/移除依赖 | go get package@version |
go get -u |
升级到最新次要版本或补丁版本 | go get -u package |
go get -u ./... |
升级所有依赖 | go get -u ./... |
go list -m all |
列出所有依赖 | go list -m all |
go list -m -versions |
查看包可用版本 | go list -m -versions package |
编辑命令
| 命令 | 说明 | 示例 |
|---|---|---|
go mod edit -require |
添加require指令 | go mod edit -require=pkg@v1.0.0 |
go mod edit -replace |
添加replace指令 | go mod edit -replace=old=new |
go mod edit -exclude |
添加exclude指令 | go mod edit -exclude=pkg@v1.0.0 |
go mod edit -droprequire |
删除require指令 | go mod edit -droprequire=pkg |
go mod edit -dropreplace |
删除replace指令 | go mod edit -dropreplace=old |
go mod edit -dropexclude |
删除exclude指令 | go mod edit -dropexclude=pkg |
go mod edit -fmt |
格式化go.mod文件 | go mod edit -fmt |
环境变量命令
| 命令 | 说明 | 示例 |
|---|---|---|
go env |
查看所有环境变量 | go env |
go env -w |
设置环境变量 | go env -w VAR=value |
go env -u |
取消设置环境变量 | go env -u VAR |
诊断和清理命令
| 命令 | 说明 | 示例 |
|---|---|---|
go clean -modcache |
清理模块缓存 | go clean -modcache |
go mod download -json |
JSON格式下载信息 | go mod download -json |
go list -m -json |
JSON格式模块信息 | go list -m -json package |
go version -m |
查看二进制文件的模块信息 | go version -m binary |
工作流命令组合
项目初始化流程
| 步骤 | 命令 | 说明 |
|---|---|---|
| 1 | mkdir project && cd project |
创建项目目录 |
| 2 | go mod init module-name |
初始化模块 |
| 3 | go mod tidy |
整理依赖 |
| 4 | go mod download |
下载依赖 |
日常开发流程
| 场景 | 命令组合 | 说明 |
|---|---|---|
| 添加新依赖 | go get package@version && go mod tidy |
添加并整理 |
| 更新依赖 | go get -u package && go mod tidy |
更新并整理 |
| 排查问题 | go mod why package && go mod graph |
分析依赖关系 |
| 发布准备 | go mod tidy && go mod verify && go build |
完整检查 |
故障排除流程
| 问题 | 解决命令 | 说明 |
|---|---|---|
| 依赖冲突 | `go mod graph | grep package` |
| 缓存问题 | go clean -modcache && go mod download |
清理重下 |
| 版本问题 | go list -m -versions package |
查看可用版本 |
| 完整性检查 | go mod verify && go mod tidy |
验证和整理 |
常用命令参数
| 命令 | 参数 | 说明 |
|---|---|---|
go get |
-u |
升级到最新版本 |
go get |
-d |
只下载不构建 |
go list |
-m |
列出模块而不是包 |
go list |
-json |
JSON格式输出 |
go mod download |
-json |
JSON格式下载信息 |
go mod why |
-m |
解释模块而非包 |
如有问题或建议,欢迎在评论区中留言~