外观
package
Phase 01 — Go Fundamentals · 知识点 03
1. 学习目标
- 理解 package 声明与 import
- 区分可执行程序(main)与库包
- 掌握导出规则:大写公开、小写私有
- 组织多文件同包项目
2. 为什么需要
Go 通过 package 组织代码,避免全局命名冲突,控制可见性。每个 .go 文件属于一个 package,类似 ES Module,但机制是编译期的。
3. 核心概念
go
package main // 文件所属包
import (
"fmt" // 标准库
"github.com/you/agv/models" // 第三方/本地包
)| 规则 | 说明 |
|---|---|
| 同目录同 package | 一个文件夹内所有 .go 文件 package 名相同 |
| 大写导出 | func GetDevice() 可被其他包调用 |
| 小写私有 | func parseConfig() 仅包内可见 |
| main 包 | 含 func main() 可编译为可执行文件 |
4. 基础语法
agv-server/
├── go.mod
├── main.go // package main
└── device/
└── agv.go // package devicedevice/agv.go:
go
package device
type AGV struct {
ID string
}
func NewAGV(id string) *AGV {
return &AGV{ID: id}
}main.go:
go
package main
import (
"fmt"
"github.com/you/agv-server/device"
)
func main() {
agv := device.NewAGV("AGV-001")
fmt.Println(agv.ID)
}5. 代码解析
- import 路径 = module path + 子目录
- 使用
device.NewAGV而非NewAGV(包名前缀) - 包名通常与目录名一致,但可以不同(不推荐)
6. JavaScript / TypeScript 对比
| Go | JS/TS |
|---|---|
| package + import | ES module import/export |
| 大写/小写控制可见性 | export / 不 export |
| 无 default export | 常用 named export |
Go 没有 export 关键字,靠首字母大小写决定可见性——这是 JS 开发者最容易忽略的规则。
7. 常见错误
- import 未使用 → 编译错误(Go 强制)
- 循环 import → 编译错误,需重构
- package 名与目录不一致 → 可读性差
- 在 main 包写业务逻辑 → 应拆到独立 package
8. 实际应用
数字孪生项目分层:
cmd/server/main.go → 入口
internal/device/ → 设备逻辑(小写目录,internal 包外不可 import)
internal/api/ → HTTP 处理
pkg/models/ → 可复用模型(可选)9. 深入理解
internal/目录:Go 编译器强制,外部 module 无法 import- 标准库 import 路径无域名:
"fmt"、"net/http" - 匿名 import
_ "github.com/lib/pq"仅执行 init,不使用包内符号
10. 练习
- L1:创建两文件同 package main
- L2:创建 device 包并在 main 中调用
- L3:验证大小写导出规则
- L4:搭建 agv-server 基础目录结构
11. 学习检查
- [ ] 如何导出函数?
- [ ] main 包与普通包区别?
- [ ] internal 有何特殊?
12. 下一步
→ array / slice:在 package 内使用复合数据类型