go 1.16+ 不用配置 gopath,必须使用 go modules;go mod init 的模块路径须为可解析域名前缀(如github.com/user/proj),且与所有 import 路径严格一致,否则导致 import 失败或 go get 无效。

不用配 GOPATH,也不用纠结“用哪个”,Go 1.16+ 默认走 Go Module,它才是你现在该用、也必须用的版本管理方式。
go mod init 后 module 路径写错,会导致 import 失败或别人无法 go get
模块路径不是本地文件夹名,而是将来别人引用你包时的 import 前缀。写错就等于给包起了个“假身份证”。
- 错误写法:
go mod init ./mytool→ 模块路径变成./mytool,无法被 import - 错误写法:
go mod init mytool→ 虽能编译,但别人执行go get mytool会失败(没域名,不合法) - 正确写法:
go mod init github.com/yourname/mytool(与 GitHub 仓库 URL 一致) - 如果托管在 GitLab 或私有 Git,模块路径也应匹配实际地址,比如
gitlab.com/team/proj
go run main.go 报 “main module does not contain package” 怎么快速定位
这不是依赖问题,是 Go 找不到你这个 main.go 在当前模块里的“合法身份”。核心只看两点:模块根目录在哪、main.go 相对于它的路径是否匹配 import 规则。
初始化并管理阿里云SDK Go 客户端,涵盖 sync.Once 单例、goroutine 安全、endpoint 与 region 配置、VPC 端点及调试。
- 检查当前目录是否在模块根下(即存在
go.mod文件) - 确认
main.go所在路径相对于模块根的路径,就是它应有的 package 导入路径前缀 - 例如模块路径是
github.com/you/app,而main.go在cmd/server/main.go,那它就属于github.com/you/app/cmd/server包,不能直接go run main.go在cmd/server目录下跑——得回到模块根,用go run cmd/server/main.go - 临时调试可加
-work参数看 Go 实际解析路径:go run -work main.go
GO111MODULE=off 或 on 会影响 go get 行为,但你几乎不需要手动设
Go 1.16+ 默认 GO111MODULE=on,只有当你在 $GOPATH/src 下且没 go.mod 时,才可能意外触发 auto 模式降级。手动设 off 只会让事情更难 debug。
- 不要运行
go env -w GO111MODULE=off—— 这会强制退回到 GOPATH 模式,导致依赖找不到、go mod命令失效 - 如果你发现
go get把包下到$GOPATH/src而不是$GOPATH/pkg/mod,说明当前目录不在模块内,或go.mod被误删 - 代理设置只需配
GOPROXY(如https://goproxy.cn),GO111MODULE留默认即可 - 极少数老项目需要兼容 GOPATH 构建,才需显式设
GO111MODULE=off,新学习者完全不用碰
真正容易被忽略的是:模块路径一旦写进 go.mod,后续所有 import 都要跟它对齐;改路径不是改一行那么简单,得同步改所有 import 语句、CI 脚本、文档示例,甚至已发布的 tag。初始化时多花 10 秒确认域名和仓库一致,比后期重构省三天。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!










