
本文详解 go 项目中自定义包(如 `app/model`)的正确导入方式,重点说明 gopath 的作用、目录结构规范及 import 路径与文件系统路径的本质区别,帮助开发者避免“cannot find package”等常见错误。
在 Go 中,import "app/model" 并非指向相对路径或当前工作目录下的子文件夹,而是表示从 $GOPATH/src/(或模块根目录)开始查找的全路径导入标识符。你遇到的错误 /usr/local/go/src/pkg/model (from $GOROOT) 正是 Go 编译器误将 app/model 解析为标准库路径(因 $GOROOT/src/pkg/ 存在类似结构),根源在于包未置于合法的导入上下文中。
✅ 正确做法(Go 1.11+ 推荐模块化方案):
- 在项目根目录(如 app/)初始化 Go 模块:
cd app go mod init example.com/app
- 确保目录结构为:
app/ ├── go.mod # 由 go mod init 生成 ├── main.go └── model/ ├── file1.go └── file2.go
- 在 main.go 中导入:
package main
import ( "fmt" "example.com/app/model" // ✅ 模块路径 + 子目录 )
func main() { fmt.Println(model.SomeFunc()) // 假设 model 定义了导出函数 }
⚠️ 注意事项: - `import "app/model"` **永远无效**——Go 不支持基于当前目录的短路径导入; - 若未启用模块(即无 `go.mod`),必须严格遵循 `$GOPATH/src/` 结构,例如将项目放在 `$GOPATH/src/example.com/app/`,再用 `import "example.com/app/model"`; - 所有被导入的 `.go` 文件需声明相同 `package model`(非 `package main`),且首字母大写的标识符才可被外部访问; - 运行 `go build` 或 `go run main.go` 时,务必在包含 `go.mod` 的目录下执行,否则模块解析失败。 ? 总结:Go 的 import 路径 = 模块名 + 相对子路径(模块模式)或 `$GOPATH/src/` 下的完整路径(GOPATH 模式)。放弃“类 Python 相对导入”思维,拥抱显式、唯一、可复现的模块路径设计,是解决导入问题的根本之道。










