Go 的 import 语句必须位于 package 声明后、文件顶部,路径须为双引号包裹的完整模块路径(如 "github.com/user/project/utils"),不支持相对路径;多包导入需用括号分组,每行一个包;可使用别名解决冲突或简化长包名,但禁用点导入;循环导入在编译期报错;常见“包找不到”问题多因模块路径不匹配或 GOPROXY 异常。

Go 的 import 语句必须写在文件顶部、package 声明之后,且路径必须是双引号包裹的完整导入路径(不是相对路径或本地文件名)。
import 路径必须是模块路径,不是文件系统路径
Go 不支持像 Python 那样用 ./utils 或 ../model 导入本地包。所有 import 后跟的字符串,都必须是 Go 模块定义的路径(即 go.mod 中 module 声明的根路径 + 子目录)。
- 正确示例(模块名为
github.com/user/project):"github.com/user/project/utils" - 错误写法:
"./utils"、"utils"、"project/utils" - 如果想导入本模块下的子目录,路径就是
"github.com/user/project/utils",哪怕它和当前文件在同一级目录下
多个包导入必须用括号分组,不能单行多个
Go 强制要求多包导入使用括号语法,不支持 Python 或 JS 那样的逗号分隔单行写法。
- ✅ 正确:
import ( "fmt" "os" "github.com/user/project/config" ) - ❌ 错误:
import "fmt", "os"或import "fmt" "os" - 括号内每行一个包,路径用双引号,末尾不加逗号(虽然加了也不会报错,但 gofmt 会自动删掉)
导入别名用于解决命名冲突或简化长包名
当两个包导出同名标识符(比如都含 NewClient),或包名太长/含短横线(如 gopkg.in/yaml.v3),就需要用别名。
立即学习“go语言免费学习笔记(深入)”;
- 重命名包:
import yaml "gopkg.in/yaml.v3"→ 后续用yaml.Unmarshal - 忽略导入(只执行 init):
import _ "net/http/pprof" - 本地重命名避免冲突:
import json2 "encoding/json"(当已导入"github.com/xxx/json"且两者都有Marshal) - 别名不能是
.(点导入)——Go 已明确废弃该语法,编译会报错
循环导入会直接编译失败,没有运行时提示
Go 在编译期就检测 import 循环,一旦出现 a → b → a 或更长链路,立即报错:import cycle not allowed。
- 典型场景:A.go 导入 B 包,B.go 又反向导入 A 包(哪怕只是用了 A 包里的某个类型)
- 常见误操作:把类型定义放在 main 包里,然后让其他包去 import main —— 这是非法的,main 包不可被导入
- 解法通常是抽离共享类型到独立的
types或model包,让双方都导入它,而非互相导入
最容易被忽略的一点:import 路径是否匹配 go.mod 中声明的模块路径,以及 GOPROXY 是否能正常解析该路径——很多“包找不到”问题其实不是写错了,而是模块代理返回了 404 或本地缓存损坏,这时候 go clean -modcache 和检查 go env GOPROXY 比改 import 更管用。










