Golang struct 结构体核心概念:声明、组合与 Method
Golang 语言放弃了包括传统类继承在内的大部分面向对象特性,转而采用“组合优于继承”的设计哲学。本文重点讲解 struct(结构体)的基础操作,涵盖声明、带名/位置初始化、使用匿名字段模拟继承以及 Method Receiver 的调用规则。
结果或目标
理解 struct 作为一组字段集合的本质,掌握如何灵活定义数据模型并利用组合替代复杂的类层次结构。
准备条件
go环境已安装并可运行。- 具备基础的 Golang
fmt包使用经验。
真实操作顺序
第1步:Struct 的结构化声明与初始化
目的:定义包含多个字段的自定义类型,并学习不同的实例赋值方式。 动作:
type person struct {
name string
age int
}
func main() {
// 1. 零值初始化后逐个赋值
var p person
p.name = "tom"
p.age = 25
fmt.Println(p.name)
// 2. 位置参数初始化(必须按声明顺序)
p1 := person{"Tom1", 25}
fmt.Println(p1.name)
// 3. 命名参数初始化(推荐,更清晰且支持乱序)
p2 := person{name: "Tom", age: 24}
fmt.Println(p2.name)
}
第2步:利用匿名字段实现结构体的组合
目的:通过将一个结构体作为另一个结构体的“匿名”成员,实现字段的复用与继承效果。 入口:定义新的 Struct 时直接写入内嵌类型名。
type Human struct {
name string
age int
weight int
}
// Student 包含了 Human 的所有字段
// tyep -> type (原文拼写错误已修正)
type Student struct {
Human // 匿名字段
speciality string
}
重要参数与状态:
- 字段访问优先级:当外层级与内层级字段重名时,优先取外层的。完成判断:外层同名字段覆盖内层字段可见性。
- 显式访问内层:可通过指定 struct 名访问内部字段,如
mark.Human。操作示例:mark.Human.age -= 1。 - 灵活性:不仅限于 struct 间嵌套,自定义类型和内置类型均可作为匿名字段,并可直接在相应字段上执行方法。
第3步:Method Receiver 的传递机制
目的:为 struct 绑定方法,控制是对原对象还是副本进行操作。 动作:
type Rect struct {
x, y float64
width, height float64
}
// 值接收者:副本操作,不改变原对象
func (r Rect) Area() float64 {
return r.width * r.height
}
// 指针接收者:原对象操作
func (b *Box) SetColor(c Color) {
b.color = c
}
行为差异说明:
- Receiver 默认以值传递:修改 receiver 的参数不会影响外部原始变量。
- 指针接收者 (*T):对实例对象的内容发生实际修改。注意:若 method 的 receiver 是
*T,调用时可传入 T 类型的变量 V,编译器自动解引用处理,无需手动使用&V。
第4步:Method 的组合与重写
目的:展示组合模式下的方法调用链以及如何扩展或覆盖基类行为。
func (h *Human) SayHi() {
fmt.Println(h.name)
}
func (e *Student) SayHi() {
// 调用父级方法
e.Human.SayHi()
// 扩展行为
fmt.Println(e.School)
}
完成判断:Student 实例既可调用嵌入 Human 的方法,也可调用自己定义的 SayHi 实现方法的“重写”,体现了 Golang 面向接口与组合的编程风格。
简要总结
Golang 中的 struct 提供了轻量级的数据类型封装能力,通过匿名字段实现灵活的代码组合而非复杂的继承树。掌握值/指针接收者的区别对于内存管理与数据一致性至关重要。以上就是 Golang 结构体 struct 及其方法组合特性的详细内容,更多关于 Golang 面向对象编程的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









