外观
练习 — interface
对应知识点:
interface· 隐式实现 · type assertion 对应文档:docs/phase-02-core/interface.md代码目录:workspace/phase-02/interface/
前置条件:完成 Phase 01 struct、method、pointer 练习。
Level 1 — 基础
练习 1.1 · Mover 接口
在 workspace/phase-02/interface/ 创建项目。
要求:
- 定义
Moverinterface:Move() string - 定义
AGVstruct(ID、Speed),实现Move(),返回"AGV-001 moving at 1.2 m/s"格式 - main 中创建 AGV 并调用
Move()
练习 1.2 · 隐式实现
不运行代码,回答并写入 notes-interface.md:
- Go 的 interface 实现与 TypeScript
implements有何不同? - 若
AGV用值接收者实现Move(),*AGV是否满足Mover? - 若用指针接收者实现,值类型
AGV是否满足Mover?
练习 1.3 · 空接口
要求:
- 声明
var v any - 依次赋值:
string、int、AGVstruct - 用
fmt.Printf("%T\n", v)打印每次的类型
Level 2 — 应用
练习 2.1 · Reporter 多态
要求:
- 定义
Reporterinterface:Report() string AGV和Sensor(Name、Value)均实现Reporter- 函数
PrintReports(devices []Reporter)遍历打印
练习 2.2 · 函数参数多态
要求:
- 函数
Describe(d Reporter) string返回"[TYPE] report" - main 传入 AGV 和 Sensor,验证同一函数处理不同类型
练习 2.3 · Type Assertion
要求:
- 将
Reporter变量断言为AGV:agv, ok := r.(AGV) - 分别演示断言成功与失败(传入 Sensor 时 ok 为 false)
- 使用 type switch 区分 AGV / Sensor / default
Level 3 — 综合
练习 3.1 · 接口组合
要求:
- 定义
Device interface { Mover; Reporter } AGV同时满足 Mover 和 Reporter,从而满足 Device- 编写
ProcessDevice(d Device)依次调用 Move 和 Report
练习 3.2 · Mock 概念练习
要求:
- 定义
TelemetryStore interface { Save(id string, data []byte) error } - 实现
MemoryStore(内存 map) - 实现
MockStore(记录调用次数,不真正存储) - 函数
UploadTelemetry(store TelemetryStore, id string, data []byte) error依赖接口 - main 分别注入 MemoryStore 和 MockStore 演示可替换性
Level 4 — 项目实践
练习 4.1 · 数字孪生设备抽象
在 workspace/phase-02/interface/ 完成:
文件结构:
device.go:Deviceinterface(ID()、Report()、UpdateState(map[string]any) error)agv.go、sensor.go:具体实现processor.go:ProcessDevices([]Device)批量处理main.go:注册 2 台 AGV + 1 个 Sensor,模拟 Web3D 场景状态更新
要求:
- 所有设备通过
Deviceinterface 统一调度 - UpdateState 接收 JSON 兼容的 map(如
{"x":1.2,"y":3.4}) - 打印处理后每台设备的 Report
学习检查
- [ ] 隐式实现需要显式声明吗?
- [ ] 值接收者与指针接收者对 interface 满足性有何影响?
- [ ] type assertion 的
ok模式何时必须使用? - [ ] 接口组合与 struct 嵌入的区别?
提交方式
完成后说:
检查答案 — interface 练习 X.X并附上代码或笔记路径。