当前位置: 首页 > news >正文

GO_面向对象---匿名字段

Go 面向对象:匿名字段核心知识点

Go 语言没有传统的类继承,而是通过匿名字段(组合)实现代码复用、类似继承的效果,是 Go 面向对象的核心特性。

一、Go 面向对象三大特性(结合匿名字段)

  1. 继承:通过匿名字段(组合)实现,复用已有结构体的成员和方法
  2. 封装:隐藏内部实现,只对外提供功能,通过结构体 + 匿名字段实现
  3. 多态:通过接口实现

二、匿名组合(匿名字段)

1. 什么是匿名字段?

定义结构体时,只写类型,不写字段名,这个字段就是匿名字段。作用:直接复用另一个结构体的所有成员(字段 + 方法)

2. 基础语法示例

go

package main import "fmt" // 父结构体 type Person struct { name string // 姓名 sex byte // 性别 age int // 年龄 } // 子结构体:匿名字段继承 Person type Student struct { Person // 匿名字段,继承Person的所有成员 id int addr string }

三、匿名字段初始化(重点)

1. 完整初始化(必须指定匿名字段结构体名)

go

func main() { // 方式1:var 定义 var s1 Student = Student{Person{"mike", 'm', 18}, 1, "bj"} fmt.Println("s1 = ", s1) // 方式2:自动推导类型 s2 := Student{Person{"mike", 'm', 18}, 1, "bj"} fmt.Printf("s2 = %v\n", s2) }

2. 指定成员初始化

go

func main() { // 只初始化 id,其他字段默认零值 s3 := Student{id: 1} fmt.Printf("s3 = %+v\n", s3) // 显式初始化匿名字段的部分成员 s4 := Student{Person: Person{name: "mike"}, id: 1} fmt.Printf("s4 = %+v\n", s4) }

错误写法(必须记住)

go

// 编译失败!匿名字段不能直接展开赋值 // s5 := Student{"mike", 'm', 18, 1, "bj"}

规则:初始化匿名字段时,必须带上外层结构体名,否则编译报错。


四、成员操作

匿名字段继承的成员,可以直接访问 / 赋值,和结构体自身成员一样。

go

func main() { s1 := Student{Person{"mike", 'm', 18}, 1, "bj"} // 直接访问继承的字段 fmt.Println(s1.name, s1.sex, s1.age, s1.id, s1.addr) // 直接赋值 s1.name = "yoyo" s1.age = 16 fmt.Println(s1) }

五、同名字段处理(就近原则)

如果子结构体和匿名字段结构体有同名成员

  1. 默认:就近原则→ 优先使用子结构体自己的成员
  2. 显式调用子结构体.匿名字段类型.字段名

go

type Person struct { name string } type Student struct { Person // 匿名字段 name string // 同名字段 } func main() { var s Student // 就近原则:操作 Student 的 name s.name = "student" // 显式调用:操作 Person 的 name s.Person.name = "person" fmt.Printf("s.name = %s\n", s.name) // 输出 student fmt.Printf("s.Person.name = %s\n", s.Person.name) // 输出 person }

六、非结构体匿名字段

匿名字段可以是:基本类型、自定义类型,不只是结构体。

go

// 自定义类型 type mystr string type Student struct { Person // 结构体匿名字段 int // 基本类型匿名字段 mystr // 自定义类型匿名字段 } func main() { s := Student{int: 100, mystr: "hello"} fmt.Println(s.int, s.mystr) }

七、结构体指针作为匿名字段

使用指针类型作为匿名字段,节省内存,传递引用

go

type Student struct { *Person // 指针匿名字段 id int addr string } func main() { // 方式1:直接初始化 s1 := Student{&Person{"mike", 'm', 18}, 666, "bj"} fmt.Println(s1.name) // 直接访问,自动解引用 // 方式2:new 分配空间 var s2 Student s2.Person = new(Person) // 分配内存 s2.name = "yoyo" s2.sex = 'm' s2.age = 18 s2.id = 222 s2.addr = "sz" fmt.Println(s2) }

八、核心总结

  1. Go 没有继承,只有匿名字段(组合),实现代码复用
  2. 初始化匿名字段必须写结构体类型名,否则编译失败
  3. 同名字段遵循就近原则,显式调用需指定匿名字段类型
  4. 支持:结构体、基本类型、指针类型作为匿名字段
  5. 是 Go 实现类似继承的唯一方式
http://www.jsqmd.com/news/1189329/

相关文章:

  • leetcode刷题笔记(中等)1291顺次数
  • YOLOv8模型从训练到ONNX部署全流程实战指南
  • STM32与PAM8124构建高保真音频放大系统
  • APK Installer:在Windows上高效安装Android应用的3大创新设计
  • 基于混沌理论的图像加密算法设计与Python实现
  • 2026年7月最新南京积家官方售后客服电话及服务网点地址查询 - 积家官方售后服务中心
  • YOLOv12骑手头盔检测系统:技术解析与工程实践
  • Java Stream API与Lambda表达式在外卖CPS订单批量处理中的高效应用模式
  • Python 30 分钟速通:AI 开发用到的语法就够了
  • 计算机毕业设计之jsp网吧管理系统
  • 一个网站删掉1400万人的照片,他花十年做了一把钥匙
  • C++函数对象与Lambda表达式:从基础原理到STL实战应用
  • YOLOv8热成像人员检测:从原理到实战的全流程指南
  • 深入理解 JavaScript 表单与焦点事件:从基础到实战
  • 帝舵中国官方售后服务中心|服务热线及门店详细地址权威信息公告(2026年7月最新) - 帝舵中国官方服务中心
  • Hugging Face:AI开发者的模型库与工具链全解析
  • 30岁后转行AI大模型的实战指南与职业突围策略
  • Ubuntu Touch Linux mobile OS | Waydroid for Android app
  • 上海AI软件定制公司有哪些?先看场景,别一上来就谈模型
  • STM32与PAM8904实现智能分级警报系统设计
  • 企业想选靠谱商用AI数字人系统?2026年主流产品怎么选
  • MOOC数据科学课程完课率低的真相:课程设计错配学习规律
  • 终极远程桌面游戏手柄解决方案:5分钟实现Xbox手柄远程控制
  • GO_面向对象_方法
  • 深入理解 JavaScript 事件体系:Window、鼠标与键盘事件详解
  • 策略梯度定理:强化学习中的策略优化基础
  • 基于iEMS智能能源管理系统的全流程优化---( MSP硫酸镍)
  • 精度评估与 Bad Case 优化:从 mAP 到业务指标
  • 基于TPS61170和STM32的高效DC-DC升压转换设计
  • 2026年7月最新无锡萧邦官方售后客服中心地址电话及服务网点分布 - 萧邦中国官方服务中心