Skip to content

练习 — 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
  • 导出 AGV struct(ID 导出)和 NewAGV(id string, speed float64) *AGV
  • speed 字段小写(未导出)
  • 导出方法 Speed() float64Report() 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 包定义 Reporter interface(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:定义 Store interface(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

学习导航

上一篇:Go JSON · 对应知识文档 · 下一篇:Goroutine、Channel、Select