在 Go 项目中导入本地包需先用 go mod init 初始化模块并声明 module 路径,再按“module路径+子目录”格式绝对导入,如 import "example.com/myapp/internal/utils",禁止使用相对路径或无前缀导入。
在 Go 项目中导入本地包(即项目内部自定义模块),关键在于正确设置模块路径和目录结构,并使用相对或绝对的导入路径。Go 不支持像 Python 那样的“当前目录导入”,而是依赖 go.mod 定义的模块根路径 + 包所在子目录路径来定位。
Go 1.11+ 推荐使用模块(module)管理依赖和本地包。若尚未初始化,先在项目根目录运行:
go mod init your-module-name(如 go mod init example.com/myapp)go.mod 文件,其中 module 行声明了整个项目的模块路径假设你的项目结构如下:
myapp/
├── go.mod # module example.com/myapp
├── main.go
└── internal/
└── utils/
└── string.go
在 string.go 中定义一个包:
// internal/utils/string.go package utilsfunc Reverse(s string) string { // ... }
那么在 main.go 中应这样导入:
import "example.com/myapp/internal/utils"(推荐:基于模块路径的绝对导入)import "./internal/utils" 或 import "utils" —— Go 不支持这两种写法go.mod 中的 module 名 + 子目录路径以下做法会导致编译失败或行为异常:
go mod init 就尝试导入子目录 —— Go 无法解析路径,报 cannot find package
package xxx)与目录名不一致 —— 虽然语法允许,但易引发混淆,建议保持一致$GOPATH/src 下并用旧式 GOPATH 模式开发 —— 已不推荐,容易与模块模式冲突
go.mod 中误删或修改 module 行,导致导入路径失效遇到导入问题时可快速检查:
go list -f '{{.Dir}}' example.com/myapp/internal/utils 确认 Go 是否能定位到该包目录go build 或 go run main.go,观察是否提示 no required module provides package —— 多为模块路径或目录路径不匹配go mod graph | grep utils 查看模块依赖关系(需已成功构建过)