Go 入门(09):包与模块管理——go.mod、import、导出规则
更新时间:2026-09-01。本文是
languages/go/beginner/入门层第 9 篇,接 类型断言与类型 switch。任何大项目都要拆分文件和包,Go 用package组织代码,用go.mod管理依赖,本篇讲清楚核心规则。
本文要回答的问题
- package 和 module 有什么区别?
- 怎么 import 包?怎么导入标准库、第三方包、本地包?
- 首字母大写导出是什么规则?为什么这么设计?
- go.mod 文件里都有什么?go get 做什么?
一、package vs module
| 概念 | 作用 |
|---|---|
| package(包) | 源码单位,把一组相关 .go 文件放在同一个包,方便组织代码 |
| module(模块) | 项目/依赖单位,一个项目就是一个 module,包含多个 package,用 go.mod 声明版本、依赖 |
关系:一个 module → 多个 package → 多个 .go 文件。
二、package 声明
每个 .go 文件第一行必须写 package 包名:
package main // main 包,生成可执行文件
package utils // utils 包,库包,不生成可执行两个特殊规则:
package main+func main()→ 生成可执行程序入口- 其他包都是库包,用来给别人导入使用
包名惯例:包名就是目录名,小写,不要下划线(Go 社区惯例),比如 utils 不叫 util,http 不叫 HTTPUtil。
三、import 导入包
你要用到别的包,就要 import:
// 导入标准库
import "fmt"
import "os"
import "net/http"
// 批量导入
import (
"fmt"
"os"
"net/http"
)
// 导入第三方包(github 上的)
import "github.com/gin-gonic/gin"
// 导入自己项目里的本地包
import "your-module/path/utils" // 路径从 module root 开始几个常见问题
1. 导入不使用会编译报错
Go 强制:import 了就得用,不删掉会报错。这倒逼代码干净,不会有一堆没用的导入。
2. 别名导入
如果两个包名冲突,可以给别名:
import (
mutils "my/project/utils"
putils "other/project/utils"
)3. 点导入(不推荐)
import . "fmt"
// 可以直接写 Println("hello"),不用 fmt.Println不推荐,会污染命名空间,不知道函数从哪来。
四、导出规则:首字母大写导出,小写私有
这是 Go 最简洁的设计:不需要 public/private,首字母大小写就是导出规则:
- 标识符(变量、函数、类型、结构体字段)首字母大写 → 导出,包外可以访问
- 首字母小写 → 不导出,只有包内可以访问
// 在 utils 包中
var GlobalVar = 123 // 大写 → 包外可见
var privateVar = 456 // 小写 → 只有包内可见
func PublicFunc() {} // 导出
func privateFunc() {} // 不导出
type PublicStruct struct {
PublicField int // 导出
privateField int // 不导出
}简洁不?Go 把访问控制做在语法层面,一个大小写搞定,不需要额外关键字。
五、go.mod 模块文件
每个 module 根目录有一个 go.mod 文件:
module github.com/yourname/yourproject // 模块路径(对应仓库地址)
go 1.22 // 要求的 Go 版本
require github.com/gin-gonic/gin v1.9.1 // 依赖的第三方模块和版本常用命令:
go mod init <module-path> # 初始化新模块,生成 go.mod
go get <module>@version # 拉取/更新依赖,更新 go.mod
go mod tidy # 整理依赖,去掉没用的,加上需要的
go mod download # 下载所有依赖到本地缓存关键概念:模块路径
- 通常是你代码仓库的地址,比如
github.com/you/project - 这样别人才能通过
go get github.com/you/project下载你的代码 - 私有项目或本地项目随便起一个名字也行
六、常见坑对照
| 坑 | 现象 | 对策 |
|---|---|---|
| 结构体字段首字母小写 | JSON 序列化导不出来,包外访问不到 | 需要导出的字段首字母大写 |
| import 路径错了 | 找不到包 | import 路径从模块根开始算,不是相对当前文件 |
| go: cannot find module providing package | 依赖没下载 | go get 或 go mod tidy |
| 包内多个文件重名标识符 | 同一个包里不能重名 | 每个包内标识符必须唯一 |
相关与延伸
下一篇:字符串操作——strings 与 strconv;go.sum 是 go mod 的校验文件,保证依赖哈希,进阶篇讲;Go 模块代理国内配置
GOPROXY=https://goproxy.cn在 环境搭建 提到过。
一句话总结
Go 包与模块:package 组织源码,一个 module 包含多个 package;import 导入包,导入不使用编译报错;首字母大写导出、小写私有,一句话搞定访问控制;go.mod 声明模块路径和依赖,go mod tidy 整理依赖,go get 下载更新——这就是 Go 现在标准的工程组织方式。