外观
练习 — Package Design
对应知识点:
package design对应文档:docs/phase-02-core/package-design.md代码目录:workspace/phase-02/package-design/
前置条件:掌握 go mod、import、struct 导出规则。
Level 1 — 基础
练习 1.1 · internal/device 包
在 workspace/phase-02/package-design/ 初始化 module:
bash
go mod init twin-server要求:
- 创建
internal/device/agv.go,package device - 导出
AGVstruct(ID 导出)和NewAGV(id string, speed float64) *AGV - speed 字段小写(未导出)
- 导出方法
Speed() float64和Report() string
练习 1.2 · main 调用
要求:
- 创建
cmd/server/main.go,package main - import
twin-server/internal/device - 创建 AGV 并打印 Report()
- 尝试访问
agv.speed,确认编译错误并理解原因
练习 1.3 · 同包多文件
要求:
internal/device/types.go:定义DeviceType常量(AGV、Sensor)internal/device/agv.go:AGV 实现- 同包两文件可互相访问未导出符号
Level 2 — 应用
练习 2.1 · sensor 包
要求:
- 创建
internal/device/sensor.go(同 package device) - Sensor struct:Name、value(未导出)、Active
- NewSensor、Value()、Report() 方法
练习 2.2 · registry 包
要求:
- 创建
internal/registry/registry.go - Registry 管理
map[string]string或 interface slice - Register(name, device) 和 List() 方法
- main 注册 AGV 和 Sensor
练习 2.3 · interface 统一
要求:
- 在 device 包定义
Reporterinterface(Report() string) - AGV 和 Sensor 满足 Reporter
- registry 存储
[]Reporter或 map of Reporter
Level 3 — 综合
练习 3.1 · handler + service 分层
要求:
internal/service/device_service.go:ListDevices()、GetDevice(id)internal/handler/handler.go:PrintDevices() 调用 service(暂时 fmt 输出,无 HTTP)- main 组装调用
练习 3.2 · store interface
要求:
internal/store/store.go:定义Storeinterface(Save、Get、List)internal/store/memory.go:内存实现- service 依赖 Store interface,main 注入 memory 实现
Level 4 — 项目实践
练习 4.1 · Mini Twin Server 骨架
在 workspace/phase-02/package-design/ 完成:
twin-server/
├── go.mod
├── cmd/server/main.go
└── internal/
├── device/ # AGV, Sensor, Reporter
├── registry/ # 或 service/
├── store/ # interface + memory
└── handler/ # 打印层(Phase 03 换 HTTP)要求:
go run ./cmd/server输出所有注册设备- 无循环 import
- internal 包不可被外部 module import(理解即可)
学习检查
- [ ] 大写/小写标识符的可见性规则?
- [ ] internal 目录的特殊规则?
- [ ] 如何避免循环依赖?
- [ ] cmd/ 和 internal/ 各放什么?
- [ ] NewXxx 构造函数模式的作用?
提交方式
检查答案 — Package Design 练习 X.X