Skip to content

struct

Phase 01 — Go Fundamentals · 知识点 10


1. 学习目标

  • 定义和使用 struct
  • 理解 struct 是值类型
  • 使用字面量和字段名初始化
  • 用 struct 建模业务实体(AGV、设备、传感器)

2. 为什么需要

单个变量无法表达一个 AGV 的完整信息(ID、坐标、速度、电量)。struct 将相关字段组合成一个类型,是 Go 面向数据建模的核心,类似 TS 的 interface/type,但是具体类型而非纯类型声明。


3. 核心概念

go
type AGV struct {
    ID      string
    X, Y    float64
    Speed   float64
    Battery int
    Online  bool
}

// 创建
a := AGV{ID: "AGV-001", X: 10, Y: 5, Speed: 1.2, Battery: 85, Online: true}
a2 := AGV{"AGV-002", 20, 8, 0.8, 60, true} // 按字段顺序,不推荐

// 访问
fmt.Println(a.ID, a.Speed)
a.Battery = 80
特性说明
值类型赋值/传参会复制整个 struct
无继承用组合(嵌入 struct)代替
导出大写字段名可跨包访问
零值各字段零值组合

4. 基础语法

go
type Position struct {
    X, Y float64
}

type Device struct {
    ID       string
    Position Position  // 嵌套
}

d := Device{
    ID: "sensor-01",
    Position: Position{X: 1, Y: 2},
}

嵌入(组合)

go
type AGV struct {
    ID string
    Position  // 匿名嵌入,可直接访问 X, Y
}

agv := AGV{ID: "001", Position: Position{X: 10, Y: 5}}
fmt.Println(agv.X)  // 10

5. 代码解析

  • struct 字段顺序影响内存对齐,一般按工具/format 排列
  • 嵌入是组合不是继承,无多态(多态靠 interface)
  • 比较 struct:字段都可比较时才能 ==

6. JavaScript / TypeScript 对比

Go structTS
运行时存在的类型interface 编译后消失
无 class 继承class extends
值拷贝对象引用
组合优于继承也推荐组合

Go 没有 class,struct + method + interface 构成面向对象风格。


7. 常见错误

  1. 大结构体值传递性能问题 → 用指针 *AGV
  2. 未导出字段跨包访问 → 小写字段仅包内
  3. 零值 struct 误用 → 空 ID、0 坐标可能合法需判断
  4. 把 struct 当 class 用继承思维 → 用组合

8. 实际应用

go
type AGVState struct {
    ID      string  `json:"id"`
    X       float64 `json:"x"`
    Y       float64 `json:"y"`
    Speed   float64 `json:"speed"`
    Battery int     `json:"battery"`
    Status  string  `json:"status"`
}

这是后续 JSON 序列化推送给 Three.js 的基础模型。


9. 深入理解

struct 内存布局受字段顺序影响。空 struct struct{} 不占空间,常用于 set 的 value。


10. 练习

  • L1:定义 AGV struct 并初始化
  • L2:嵌套 Position struct
  • L3:struct 值拷贝 vs 修改
  • L4:设备状态 struct 建模

11. 学习检查

  • [ ] struct 是值类型还是引用?
  • [ ] 嵌入与继承有何不同?
  • [ ] 如何导出字段?

12. 下一步

function:操作 struct 的函数


学习导航

上一篇:map · 对应练习 · 下一篇:function