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

Go语言之匿名字段与组合 -《Go语言实战指南》

Go 没有传统的面向对象继承机制,但它通过“匿名字段(embedding)”实现了类似继承的组合方式,使得一个类型可以“继承”另一个类型的字段和方法。


一、什么是匿名字段

匿名字段就是在结构体中嵌套一个类型而不显式命名字段名。该字段的名字默认就是其类型名。

示例:
type Person struct {Name stringAge  int
}type Student struct {Person     // 匿名字段,嵌入 PersonSchoolName string
}

这里的 Student 类型“组合”了 Person 类型,它自动获得了 Person 的字段和方法访问权限。


二、使用嵌入字段

s := Student{Person:     Person{Name: "Alice", Age: 20},SchoolName: "Go大学",
}fmt.Println(s.Name) // 自动访问嵌入字段的字段:Alice
fmt.Println(s.Age)  // 20

实际上等价于:

fmt.Println(s.Person.Name)

三、方法提升(Method Promotion)

如果嵌入的类型定义了方法,外层类型会自动拥有这些方法。

func (p Person) SayHi() {fmt.Println("Hi, I'm", p.Name)
}s := Student{Person: Person{Name: "Tom"}}
s.SayHi() // 自动继承 Person 的方法

四、指针匿名字段

也可以嵌入指针类型:

type Teacher struct {*Person  // 匿名嵌入指针Subject string
}

只要嵌入类型是指针或值,Go 都会自动处理方法调用的自动解引用。


五、字段名冲突的情况

如果外部结构体和匿名字段中存在同名字段或方法,优先使用外层结构体的成员

type Person struct {Name string
}type Employee struct {PersonName string // 会隐藏 Person.Name
}e := Employee{Person: Person{Name: "Tom"},Name:   "Jerry",
}
fmt.Println(e.Name)       // Jerry
fmt.Println(e.Person.Name) // Tom

六、嵌套多个匿名字段

可以同时嵌入多个匿名字段,实现多重组合:

type Contact struct {Email stringPhone string
}type Profile struct {PersonContact
}

调用:

p := Profile{Person:  Person{Name: "Lily", Age: 28},Contact: Contact{Email: "lily@example.com", Phone: "123456"},
}
fmt.Println(p.Email) // 直接访问 Contact.Email

七、小结

特性描述
匿名字段嵌入类型,无需字段名,字段名自动为类型名
方法提升嵌入类型的方法会自动“继承”
字段提升可直接访问嵌入类型的字段
字段冲突优先级外层结构体字段优先
支持指针/值嵌入嵌入字段可为值或指针类型,方法访问自动解引用
多重组合可以嵌套多个匿名字段,支持结构体“组合式编程”

http://www.lryc.cn/news/2387308.html

相关文章:

  • Linux 进阶命令篇
  • OpenCV CUDA模块图像处理------颜色空间处理之拜耳模式去马赛克函数demosaicing()
  • 2025年全国青少年信息素养大赛复赛C++集训(15):因子问题(题目及解析)
  • 如何通过仿真软件优化丝杆升降机设计
  • Vue3进阶教程:1.初次了解vue
  • WordPress免费网站模板下载
  • 【深度学习新浪潮】以图搜地点是如何实现的?(含大模型方案)
  • element的el-table翻页选中功能
  • Python打卡训练营学习记录Day38
  • deepseek开源资料汇总
  • CollUtil详解
  • Elasticsearch的运维
  • Linux编辑器——vim的使用
  • 线性回归原理推导与应用(八):逻辑回归二分类乳腺癌数据分类
  • Jenkins分配对应项目权限与用户管理
  • Mate桌面环境系统与终端模拟器参数配置
  • fabric 是一个开源框架,用于使用 AI 增强人类能力。它提供了一个模块化框架,用于使用一组可在任何地方使用的众包人工智能提示来解决特定问题
  • 基于PDF流式渲染的Word文档在线预览技术
  • 华为仓颉语言初识:结构体struct和类class的异同
  • 数据仓库基础知识总结
  • vue2使用element中多选组件el-checkbox-group,数据与UI更新不同步
  • linux磁盘分区及挂载、fdisk命令详解
  • anaconda 安装教程以及常用命令
  • C/C++的OpenCV的锐化
  • Eigen矩阵存储顺序以及转换
  • OpenLayers 加载ArcGIS瓦片数据
  • 2025蓝桥杯WP
  • 数字人教师:开启教育智慧革新之旅
  • Linux中Java开发、部署和运维常用命令
  • 详解srs流媒体服务器的集群