结构体与方法
定义与初始化
结构体将多个字段聚合为一个自定义类型,是 Go 组织数据的基本单元:
访问字段统一使用点号语法,Go 会自动在值与指针之间做适配:u3.Name 等价于 (*u3).Name。
方法
方法即带有接收者的函数。接收者分为值接收者与指针接收者:
Tip
选择接收者的经验法则:
- 方法需要修改接收者,或结构体较大时,使用指针接收者。
- 只读小结构体(如
time.Time)可使用值接收者。 - 同一类型的所有方法应保持接收者类型一致,不要混用。 :::
嵌入:组合优于继承
Go 没有继承,通过嵌入(embedding)将一个类型复用进另一个类型。被嵌入类型的字段与方法会被"提升"到外层类型:
:::warning
嵌入不是继承:d.Describe() 内部访问的仍是 Animal 的字段,不会感知 Dog 自身的扩展。外层方法与内层方法同名时,外层"遮蔽"内层,而非重写覆盖。
结构体标签与反射
字段可附带标签(tag),供 encoding/json、ORM 等运行时通过反射读取:
标签的详细应用见 JSON 处理章节。
小结
- 结构体是值类型,推荐按字段名初始化。
- 指针接收者可修改原值并避免拷贝;接收者类型应保持一致。
- 嵌入实现组合复用,方法提升简化调用,但并非继承。