Go语言的匿名字段

这篇具有很好参考价值的文章主要介绍了Go语言的匿名字段。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1、定义

Go语言支持一种特殊的字段只需要提供类型而不需要写字段名的字段**,**称之为匿名字段或者嵌套字段

所谓匿名字段实际上是一种结构体嵌套的方式,所以也可以称作嵌套字段

这种方式可以实现组合复用,即通过匿名字段,结构体可以直接访问嵌套结构体的字段和方法,而无需通过字段名或类型进行嵌套。

2、简单示例

以下是一个简单的例子:

// 人
type Person struct {
  Name  string
  Phone string
}

// 打篮球
func (p *Person) playBasketball() {
  fmt.Println("打篮球...")
}

// 联系方式
type Contact struct {
  Phone string
}

// 员工
type Employee struct {
  Person
  EmployeeId int
}

// 测试匿名字段
func TestAnonymous(t *testing.T) {
  emp := Employee{
    Person: Person{
      Name:  "baily",
      Phone: "18899999999",
    },
    EmployeeId: 1,
  }
  // 可直接使用emp调用嵌套类型的方法
  emp.playBasketball()
  
  fmt.Println("id: ", emp.EmployeeId)
  // 可直接使用emp打印出嵌套类型的所有字段
  fmt.Println("name: " + emp.Name)
  fmt.Println("name: " + emp.Phone)
}

3、嵌套类型有重复字段

在上面的例子中,Employee 结构体嵌套了 Person 结构体,通过这种方式,Employee 可以直接访问 Person 的字段和方法,而无需使用类似 emp.Person.Name这样的方式。

需要注意的是,如果结构体中有多个 匿名字段,并且它们拥有相同的字段名,那么在访问这个同名字段时,需要指定嵌套结构体的类型,以避免歧义。例如:

// 人
type Person struct {
  Name  string
  Phone string
}

// 打篮球
func (p *Person) playBasketball() {
  fmt.Println("Person打篮球...")
}

// 联系方式
type Contact struct {
  Phone string
}

func (c Contact) playBasketball() {
  fmt.Println("Contact打篮球...")
}

// 员工
type Employee struct {
  Person
  EmployeeId int
  Contact
}

// 测试匿名字段
func TestAnonymous(t *testing.T) {
  emp := Employee{
    Person: Person{
      Name:  "baily",
      Phone: "18899999999",
    },
    EmployeeId: 1,
    Contact: Contact{
      Phone: "16611111111",
    },
  }
  // 可直接使用emp调用出嵌入类型的方法
  // 多个嵌入类型的方法名相同时,需要指定匿名字段的类型
  //emp.playBasketball() // 这里就会报错
  emp.Person.playBasketball()
  emp.Contact.playBasketball()

  // 可直接使用emp打印出嵌入类型的所有字段
  fmt.Println("id: ", emp.EmployeeId)
  fmt.Println("name: " + emp.Name)

  // 多个嵌入类型的字段名相同时,需要指定匿名字段的类型
  //fmt.Println("name: " + emp.Phone) // 这里就会报错
  fmt.Println("name: " + emp.Person.Phone)
  fmt.Println("name: " + emp.Contact.Phone)
}

在这个例子中,PersonContact 都有 Phone 字段,因此在访问时需要指定具体的类型以避免歧义。

同样的,PersonContact 都有 playbasketball 方法,因此在访问时也需要指定具体的类型以避免歧义。

如果不指定则会编译报错,如下:

4、总结

  • Go语言支持匿名字段或者嵌套字段,通过这种方式可以直接访问嵌套结构体的字段和方法。
  • 在多个嵌套类型场景下,如果多个嵌套类型存在相同的字段或者方法,则需要指定具体的类型以避免歧义。

本篇完结!感谢你的阅读,欢迎点赞 关注 收藏 私信!!!

原文链接:https://mp.weixin.qq.com/s/JCFxSG7w6vRJeQS-j9R4yg文章来源地址https://www.toymoban.com/news/detail-825041.html

到了这里,关于Go语言的匿名字段的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Go 基础篇】Go语言匿名函数详解:灵活的函数表达式与闭包

    在Go语言中,函数是一等公民,这意味着函数可以像其他类型的值一样被操作、传递和赋值。匿名函数是一种特殊的函数,它没有固定的函数名,可以在代码中被直接定义和使用。匿名函数在Go语言中具有重要的地位,它们常用于实现闭包、函数式编程和并发编程等领域。 本

    2024年02月11日
    浏览(53)
  • EasyExcel自定义字段对象转换器支持转换实体和集合实体

    1. 实现ObjectConverter 2. 使用 3. 测试 3.1 导出excel 手动添加一些数据 导出 写入 excel 转换成功 3.2 导入excel 将上面生成的 excel 文件导入 读取 excel 数据并转换成功

    2024年02月11日
    浏览(44)
  • Go语言支持重载吗?如何实现重写?

    Go语言不支持传统意义上的函数和方法重载。在Go语言中,函数名或方法名不能相同但参数列表不同,因为这会导致编译错误。 然而,可以通过方法重写(override)来实现类似的功能。方法重写是指在子类中定义一个与父类同名的方法,从而覆盖父类中的方法。 下面是一个简

    2024年04月09日
    浏览(46)
  • 火星文:一种特殊的文字编码

    火星文是一种特殊的文字编码,也称为奇文,其特点是将常见的文字进行特殊的变体处理,使得原本的文字变得难以辨认,需要特定的解码方法才能阅读。 火星文生成器 | 一个覆盖广泛主题工具的高效在线平台(amd794.com) https://amd794.com/huoxingwen 火星文最早可以追溯到20世纪初,

    2024年03月25日
    浏览(43)
  • Go 语言为什么不支持并发读写 map?

    大家好,我是 frank ,「 Golang 语言开发栈」公众号作者。 01 介绍 在 Go 语言项目开发中,我们经常会使用哈希表 map ,它的时间复杂度是 O(1) ,Go 语言中的 map 使用开放寻址法避免哈希碰撞。 Go 语言中的 map 并非原子操作,不支持并发读写操作。 Go 官方认为 map 在大多数情况下

    2024年02月02日
    浏览(60)
  • Go 语言之自定义 zap 日志

    zap 日志:https://github.com/uber-go/zap zap.NewProduction 、 zap.NewDevelopment 是预设配置好的。 zap.New 可自定义配置 这是构造Logger最灵活的方式,但也是最冗长的方式。 对于典型的用例,高度固执己见的预设(NewProduction、NewDevelopment和NewExample)或Config结构体更方便。 运行 test.log 文件 运行

    2024年02月09日
    浏览(41)
  • 【Go 基础篇】Go语言结构体详解:打开自定义类型的大门

    嗨,Go语言学习者们!在编程的世界里,数据是核心,而结构体(Struct)是一种能够帮助我们更有组织地存储和操作数据的重要工具。在本篇博客中,我们将深入探讨Go语言中结构体的概念、定义、初始化、嵌套、方法以及与面向对象编程的关系,带你逐步领略结构体的魅力。

    2024年02月10日
    浏览(46)
  • [Go 夜读 第 148 期] Excelize 构建 WebAssembly 版本跨语言支持实践

    Excelize 是 Go 语言编写的用于操作电子表格文档的基础库,支持 XLAM / XLSM / XLSX / XLTM / XLTX 等多种文档格式,高度兼容带有样式、图片 (表)、透视表、切片器等复杂组件的文档,并提供流式读写支持,用于处理包含大规模数据的工作簿。可应用于各类报表平台、云计算、边缘计

    2024年02月08日
    浏览(34)
  • 【go语言】3.1.2 接口的定义和实现

    在 Go 中,接口是一种抽象类型,用来描述其他类型应该有哪些方法。它定义了一组方法,但没有实现。这些方法由其他类型实现。 接口定义的格式如下: 例如,我们可以定义一个  Shape  接口,如下所示: 这个  Shape  接口定义了两个方法: Area  和  Perimeter ,分别用于计

    2024年02月15日
    浏览(43)
  • 【go语言】2.1.3 函数的定义和使用

    在 Go 语言中,函数是一种代码抽象和复用的方式。函数可以接受参数,执行特定的操作,并返回结果。 函数的定义以  func  开始,后面跟着函数名、参数列表、返回值列表(可选)以及函数体。下面是一个函数定义的例子: 这个函数接受一个类型为  string  的参数

    2024年02月15日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包