go mod init 初始化模块时模块名必须是合法导入路径;写错需手动修改go.mod或用go mod edit -module修正;本地引用未发布子模块用replace并及时清理;GO111MODULE=on虽默认启用,但目录无go.mod、路径含空格或go get无域名时会退回到GOPATH模式。
直接在项目根目录运行 go mod init 即可初始化模块,但模块名必须是合法的导入路径(如 github.com/username/project),不能只是本地文件名或空字符串。
模块名一旦写错,go.mod 文件里的 module 行就会影响所有后续导入和依赖解析。Go 不提供内置命令自动修正,只能手动编辑:
go.mod,修改第一行 module github.com/xxx/yyy 为正确路径go mod edit -module github.com/correct/path(推荐,避免手误)go mod tidy 重新计算依赖,检查是否出现 require ...: version "..." invalid 类错误——这说明某些依赖仍按旧模块名解析,需同步更新代码中所有 import 语句当项目包含多个子模块(如 cmd/api、internal/pkg),又不想立即推送到远程仓库,用 replace 最稳妥:
go mod edit -replace github.com/yourname/project/internal/pkg=../internal/pkg
注意:
replace 路径必须是绝对路径或相对于当前 go.mod 的相对路径go mod vendor 或 CI 构建时不会包含被 replace 的内容
replace 行,否则他人 go get 会失败从 Go 1.16 开始,默认启用模块模式,但以下情况仍会退回到 GOPATH 模式:
go.mod 的子树中,且未显式设置 GO111MODULE=on
go build 时路径中含空格(某些旧版本 Windows 下触发 bug)go get 时目标包路径不带域名(如 go get foo),会被当成 GOPATH 包处理最稳做法:始终在项目根目录下操作,并确认 go env GO111MODULE 输出为 on。
模块名不是项目文件夹名,而是未来别人 import 你代码时写的路径;替换本地依赖要记得清理再发布;GO111MODULE 看似默认开启,但路径和命令写法稍有偏差就会静默掉回老模式。