go mod init 必须在项目根目录执行才能启用模块系统,否则本地导入失败;模块名需用域名格式,导入路径为模块名加相对目录,跨项目引用需用 replace 且双方都需有 go.mod,go111module 应设为 on 以确保行为一致。

go mod init 必须在项目根目录执行
没生成 go.mod,任何本地导入都会失败,报错 no required module provides package。这不是路径写错了,是 Go 根本没启用模块系统。
确认你在项目最外层目录(比如 myapp/)下运行命令:
-
go mod init example.com/myapp—— 模块名建议用域名格式,避免和标准库或第三方包冲突 - 执行后会生成
go.mod,第一行必须是module example.com/myapp - 不要在
src/或cmd/子目录里 init,否则导入路径会错位
本地子包必须按模块路径导入,不是文件路径
Go 不允许 import "./utils" 或 import "utils" 这类写法。导入路径 = 模块名 + 目录相对路径。
假设目录结构是:
myapp/
├── go.mod # module example.com/myapp
├── main.go
└── utils/
└── helper.go # package utils
那么 main.go 中必须写:
import "example.com/myapp/utils"
-
helper.go开头必须是package utils,且不能是package main - 如果把
utils/放在internal/下,比如internal/utils/,导入路径就得是example.com/myapp/internal/utils - 跨目录引用时,路径必须严格匹配磁盘结构,大小写敏感
跨目录本地模块要用 replace,且两边都得有 go.mod
如果你有两个独立项目,比如 myapp/ 和同级的 utils-lib/,且 utils-lib 的模块名是 github.com/you/utils,就不能直接 import —— Go 会去网上找。
必须在 myapp/go.mod 里加:
replace github.com/you/utils => ../utils-lib
-
../utils-lib是相对于myapp/go.mod的路径,不是相对于main.go -
utils-lib/目录下也必须有go.mod,且第一行是module github.com/you/utils,否则go mod tidy会报错 - 运行
go mod tidy后,go list -m all应该显示=> ../utils-lib,说明替换生效
GO111MODULE=auto 时容易掉坑
默认 GO111MODULE=auto,但行为取决于当前目录是否在 $GOPATH/src 内、有没有 go.mod。它可能静默退回到 GOPATH 模式,导致本地导入失效。
最稳妥的做法是显式设为 on:
- 临时:运行
GO111MODULE=on go build - 永久:执行
go env -w GO111MODULE=on - 验证:
go env GO111MODULE输出应为on
一旦设为 on,Go 就完全忽略 $GOPATH 和 vendor/,只认 go.mod 和 replace 规则 —— 这反而让行为更可预测。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!











