众所周知------"包"治百病。
理解包与模块,是 Go 迈向工程化开发的关键一环!
📂 一、包(Package)是 Go 的基本组织单位
在 Go 中,每个 .go
文件都属于某个包(package):
go
package main
- 一个包由一个或多个
.go
文件组成 - 包名决定该文件属于哪个逻辑单元
- 主程序必须是
main
包,且包含main()
函数
自定义包示例:
go
package utils
func Add(a, b int) int {
return a + b
}
📌 小贴士:
- 文件夹名不等于包名,但通常建议保持一致
- 例如:
utils/add.go
中使用package utils
📦 二、模块(Module)是项目的根目录单位
Go 1.11 引入 go module(现代 Go 的项目管理方式)
初始化模块:
sh
go mod init github.com/yourname/hellogo
会生成 go.mod
文件,内容大致如下:
go
module github.com/yourname/hellogo
go 1.20
从此你的 Go 项目脱离 GOPATH 束缚,正式进入"模块自由"时代!
🔧 三、导入标准包 & 第三方包
导入标准库非常简单:
go
import (
"fmt"
"math"
)
使用第三方包(比如 Gin):
bash
go get github.com/gin-gonic/gin
go.mod
会自动加入依赖记录:
go
require github.com/gin-gonic/gin v1.9.0
🧠 同时生成/更新 go.sum
文件用于校验包完整性,保障供应链安全。
🛠️ 四、自定义包的使用
项目结构示例:
myapp/
├── go.mod
├── main.go
└── utils/
└── calc.go
utils/calc.go:
go
package utils
func Add(x, y int) int {
return x + y
}
main.go:
go
package main
import (
"fmt"
"myapp/utils"
)
func main() {
fmt.Println(utils.Add(2, 3))
}
⚠️ 模块名与包路径需匹配,否则导入失败!
🗃️ 五、推荐的项目结构(中型项目)
myapp/
├── cmd/ # 主程序入口(main.go)
├── pkg/ # 可复用公共包
├── internal/ # 内部包(只能被当前 module 引用)
├── api/ # 接口定义结构体
├── configs/ # 配置文件
├── go.mod
└── README.md
📌 internal
是 Go 的"私有访问控制机制":
- internal 下的包只能被本模块代码引用
- 防止被外部误用,提高安全性和封装性
🔁 六、常用 go 命令回顾
命令 | 说明 |
---|---|
go mod init |
初始化模块 |
go get |
安装依赖包 |
go build |
构建编译 |
go run |
编译 + 运行 |
go fmt |
格式化所有 Go 文件 |
go clean |
清除构建缓存 |
go test |
执行测试函数(_test.go) |
go mod tidy |
清理无效依赖、补全缺失模块 |
🧠 总结
- ✅ 包(package) 是最小逻辑单位,决定代码归属
- ✅ 模块(module) 是工程管理单位,通过
go.mod
管理依赖 - ✅
go get
、go mod tidy
、internal
等机制,保证模块解耦、依赖清晰 - ✅ 包和模块是 Go 工程化开发的起点,是你走向架构师之路的第一步!
🧪 推荐练习
- ✅ 写一个
utils
包,封装Add
,Sub
函数 - ✅ 在
main.go
中引用它,组织模块结构 - ✅ 修改
go.mod
,改为 GitHub 上实际地址后发布
🏁 下一篇预告
👉 Go语言-初学者日记(五):文件操作与 JSON 实战,打造实用命令行工具!