Go 的 import 语句必须紧接 package 声明后置于文件顶部,不可在函数内或中间插入空行/普通注释;单行与多行写法等价,但多行需双引号包裹;. 导入平铺标识符易冲突,_ 导入仅执行 init();module 模式下禁用相对路径,须用模块路径导入。

Go 的 import 语句必须写在文件顶部,且只能跟在 package 声明之后
Go 不允许在函数内或任意位置写 import,否则编译直接报错:import statement not allowed here。所有导入必须集中放在文件开头,紧接 package xxx 后面,中间不能有空行或注释(除非是文档注释 // Package xxx)。
常见错误场景:
- 把
import写在package main上方 → 报错expected 'package', found 'import' - 在
func main()里写import "fmt"→ 报错import statement not allowed here - 在
package main和import之间加了普通注释或空行 → 部分老版本 Go 会报错,新版本虽容忍但不推荐
单行 import 和多行 import 写法与实际效果完全等价
Go 编译器不区分写法,import "fmt" 和 import ( "fmt" "os" ) 在语义和性能上无差别,选哪种纯看可读性和团队规范。
但要注意:
立即学习“go语言免费学习笔记(深入)”;
- 多行写法中每个包路径必须用双引号包裹,不能省略;
import ( fmt os )是非法语法 - 如果只引入一个包,没必要硬套括号形式,
import "net/http"更简洁 - 多行形式更适合配合 goimports 工具自动排序和去重,避免手动维护混乱
点导入(. import)和下划线导入(_ import)的用途截然不同
. 导入会把目标包的导出标识符“平铺”进当前命名空间,容易引发命名冲突,基本不建议使用;_ 导入则只执行包的 init() 函数,不引入任何标识符,常用于注册驱动或启动副作用。
典型用例:
-
import . "strings"→ 可直接调用Replace(...)而非strings.Replace(...),但一旦strings和本地变量同名(比如也有个Replace函数),就会编译失败 -
import _ "github.com/lib/pq"→ 让 pq 包完成 SQL 驱动注册,后续才能用sql.Open("postgres", ...),但你不会直接调用 pq 里的任何函数 - 误用
_:写了import _ "fmt"→fmt.Println就不可用了,因为没真正导入该包的符号
相对路径 import 在 module 模式下被禁止,必须用模块路径
启用 Go modules(即存在 go.mod 文件)后,import "./utils" 或 import "../shared" 这类相对路径会触发编译错误:use of internal package not allowed 或 invalid import path。
正确做法是:
- 确保项目已初始化 module:
go mod init example.com/myapp - 所有 import 必须以模块路径为前缀,例如
import "example.com/myapp/utils" - 跨模块引用时,路径就是
github.com/user/repo/subpkg,不是本地文件系统路径 - 想复用本地未发布代码?要么发布到私有仓库并
go get,要么用replace在go.mod中临时重定向
_ 和 . 的行为差异、以及 IDE 自动补全对多行 import 的格式化偏好,都是实际协作中容易卡住的地方。










