go get 曾用于下载并安装导入的包及其依赖,但在 Go 1.16+ 的模块化时代,它主要作为依赖获取命令(不自动修改 go.mod),而日常构建通常由 go build 或 go run 自动触发依赖解析。
`go get` 曾用于下载并安装导入的包及其依赖,但在 go 1.16+ 的模块化时代,它主要作为依赖获取命令(不自动修改 `go.mod`),而日常构建通常由 `go build` 或 `go run` 自动触发依赖解析。
在 Go 语言中,是否必须显式执行 go get 才能使用外部包?答案取决于你的 Go 版本和项目是否启用 Go Modules(自 Go 1.11 默认启用,Go 1.16 起强制启用)。
✅ 现代 Go(1.16+)推荐做法:
你无需手动运行 go get 来使用已声明依赖的包。只要 import 语句存在,且 go.mod 文件已正确初始化(通过 go mod init),执行以下任一命令即可自动解析、下载并缓存所需依赖:
go build go run main.go go test
这些命令会按需读取 go.mod,检查缺失依赖,并从模块代理(如 proxy.golang.org)拉取对应版本,全程静默完成——无需人工干预。
⚠️ 何时仍需 go get?
go get 当前的核心用途是显式升级或添加依赖,例如:
# 添加新依赖(同时写入 go.mod) go get github.com/retep-mathwizard/utils/convert # 升级特定依赖到最新版 go get github.com/skilstak/go@latest # 升级至指定语义化版本 go get github.com/skilstak/go@v1.2.0
注意:go get 在 Go 1.17+ 中默认只更新 go.mod 和 go.sum,不安装命令(即不再把包放入 $GOPATH/bin);若需安装可执行工具(如 gofmt),应改用 go install:
go install golang.org/x/tools/cmd/gopls@latest
? 以你的仓库为例:
当你运行 go get github.com/retep-mathwizard/utils/convert,Go 不仅下载该包,还会递归解析其 import "github.com/skilstak/go" 等依赖,并确保所有版本兼容性写入 go.mod。但若你已在代码中 import 了该路径,后续 go build 同样会自动完成此流程。
? 最佳实践总结:
- 初始化项目:go mod init myproject
- 编写代码并 import 所需包
- 直接 go build —— 依赖自动下载(首次)并缓存于 $GOPATH/pkg/mod
- 需要显式管理依赖版本时,才使用 go get(配合 @version)
- 定期运行 go mod tidy 清理未使用依赖并补全缺失项
这样既保证可重现构建,又避免冗余操作,符合 Go 模块设计的“声明即所得”哲学。


















