外观
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) // 105. 代码解析
- struct 字段顺序影响内存对齐,一般按工具/format 排列
- 嵌入是组合不是继承,无多态(多态靠 interface)
- 比较 struct:字段都可比较时才能
==
6. JavaScript / TypeScript 对比
| Go struct | TS |
|---|---|
| 运行时存在的类型 | interface 编译后消失 |
| 无 class 继承 | class extends |
| 值拷贝 | 对象引用 |
| 组合优于继承 | 也推荐组合 |
Go 没有 class,struct + method + interface 构成面向对象风格。
7. 常见错误
- 大结构体值传递性能问题 → 用指针
*AGV - 未导出字段跨包访问 → 小写字段仅包内
- 零值 struct 误用 → 空 ID、0 坐标可能合法需判断
- 把 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