Go 要求所有包导入路径必须是绝对路径(相对于 GOPATH/src 或 Go Modules 根目录),不支持相对路径(如 ./common);本地包应使用以模块名或项目路径开头的完整导入路径,例如 "myapp/common"。
go 要求所有包导入路径必须是绝对路径(相对于 gopath/src 或 go modules 根目录),不支持相对路径(如 `./common`);本地包应使用以模块名或项目路径开头的完整导入路径,例如 `"myapp/common"`。
在 Go 中,导入本地包是一个初学者常遇到的误区。错误地使用相对路径(如 "./common")会导致编译失败,并提示 local import "./common" in non-local package —— 这是因为 Go 语言规范明确禁止在非命令行主包(即非 package main 的独立可执行包)中使用相对导入路径,且所有导入路径必须是“完整、可解析的导入路径”。
✅ 正确做法是:将本地包置于 $GOPATH/src/(旧式 GOPATH 模式)或模块根目录下(Go Modules 模式),并使用基于工作区路径的绝对导入路径。
假设你的项目结构如下(使用传统 GOPATH 模式):
/home/me/go/src/myapp/
├── main.go
├── common/
│ └── common.go
└── routers/
└── router.go
那么 main.go 中应这样导入:
import (
"log"
"net/http"
"myapp/common" // ✅ 正确:以 myapp/ 开头,对应 $GOPATH/src/myapp/common
"myapp/routers" // ✅ 正确:同理
)
⚠️ 注意事项:
- 不要写 ./common 或 ../common —— Go 不支持相对导入(除极少数测试场景外,且仍受限);
- 不要省略前缀直接写 "common" —— Go 会去 $GOROOT/src 和 $GOPATH/src 的顶层查找,而非子目录;
- 若使用 Go Modules(推荐),请先在项目根目录运行 go mod init myapp,确保 go.mod 文件存在,此时导入路径仍为 "myapp/common"(模块名作为根路径),Go 工具链会自动解析;
- 包名(package common)与导入路径末段(myapp/common 中的 common)可以不同,但通常保持一致以提升可读性;
- 所有本地包目录内必须包含有效的 package xxx 声明,且不能与 main 包同名。
? 小技巧:可通过 go list -f '{{.Dir}}' myapp/common 验证 Go 是否能正确定位包路径。若报错,说明路径未被识别,需检查目录结构或模块初始化状态。
总结:Go 的导入机制强调可重现性与可移植性,因此强制使用绝对路径。只要确保项目位于 $GOPATH/src/ 下(或已启用 Go Modules 并配置好模块路径),并采用











