Skip to content

练习 — 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/ 创建项目。

要求

  • 定义 Mover interface:Move() string
  • 定义 AGV struct(ID、Speed),实现 Move(),返回 "AGV-001 moving at 1.2 m/s" 格式
  • main 中创建 AGV 并调用 Move()

练习 1.2 · 隐式实现

不运行代码,回答并写入 notes-interface.md

  1. Go 的 interface 实现与 TypeScript implements 有何不同?
  2. AGV 用值接收者实现 Move()*AGV 是否满足 Mover
  3. 若用指针接收者实现,值类型 AGV 是否满足 Mover

练习 1.3 · 空接口

要求

  • 声明 var v any
  • 依次赋值:stringintAGV struct
  • fmt.Printf("%T\n", v) 打印每次的类型

Level 2 — 应用

练习 2.1 · Reporter 多态

要求

  • 定义 Reporter interface:Report() string
  • AGVSensor(Name、Value)均实现 Reporter
  • 函数 PrintReports(devices []Reporter) 遍历打印

练习 2.2 · 函数参数多态

要求

  • 函数 Describe(d Reporter) string 返回 "[TYPE] report"
  • main 传入 AGV 和 Sensor,验证同一函数处理不同类型

练习 2.3 · Type Assertion

要求

  • Reporter 变量断言为 AGVagv, 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.goDevice interface(ID()、Report()、UpdateState(map[string]any) error)
  • agv.gosensor.go:具体实现
  • processor.goProcessDevices([]Device) 批量处理
  • main.go:注册 2 台 AGV + 1 个 Sensor,模拟 Web3D 场景状态更新

要求

  • 所有设备通过 Device interface 统一调度
  • UpdateState 接收 JSON 兼容的 map(如 {"x":1.2,"y":3.4}
  • 打印处理后每台设备的 Report

学习检查

  • [ ] 隐式实现需要显式声明吗?
  • [ ] 值接收者与指针接收者对 interface 满足性有何影响?
  • [ ] type assertion 的 ok 模式何时必须使用?
  • [ ] 接口组合与 struct 嵌入的区别?

提交方式

完成后说:

检查答案 — interface 练习 X.X

并附上代码或笔记路径。


学习导航

上一篇:method · 对应知识文档 · 下一篇:Go Error Handling