ToB企服应用市场:ToB评测及商务社交产业平台

标题: Go语言的匿名字段 [打印本页]

作者: 汕尾海湾    时间: 2024-4-27 20:25
标题: Go语言的匿名字段
1、定义

Go语言支持一种特殊的字段只需要提供类型而不需要写字段名的字段**,**称之为匿名字段或者嵌套字段。
所谓匿名字段实际上是一种结构体嵌套的方式,所以也可以称作嵌套字段。
这种方式可以实现组合复用,即通过匿名字段,结构体可以直接访问嵌套结构体的字段和方法,而无需通过字段名或类型进行嵌套。
2、简单示例

以下是一个简单的例子:
  1. // 人
  2. type Person struct {
  3.   Name  string
  4.   Phone string
  5. }
  6. // 打篮球
  7. func (p *Person) playBasketball() {
  8.   fmt.Println("打篮球...")
  9. }
  10. // 联系方式
  11. type Contact struct {
  12.   Phone string
  13. }
  14. // 员工
  15. type Employee struct {
  16.   Person
  17.   EmployeeId int
  18. }
  19. // 测试匿名字段
  20. func TestAnonymous(t *testing.T) {
  21.   emp := Employee{
  22.     Person: Person{
  23.       Name:  "baily",
  24.       Phone: "18899999999",
  25.     },
  26.     EmployeeId: 1,
  27.   }
  28.   // 可直接使用emp调用嵌套类型的方法
  29.   emp.playBasketball()
  30.   
  31.   fmt.Println("id: ", emp.EmployeeId)
  32.   // 可直接使用emp打印出嵌套类型的所有字段
  33.   fmt.Println("name: " + emp.Name)
  34.   fmt.Println("name: " + emp.Phone)
  35. }
复制代码
3、嵌套类型有重复字段

在上面的例子中,Employee 结构体嵌套了 Person 结构体,通过这种方式,Employee 可以直接访问 Person 的字段和方法,而无需使用类似 emp.Person.Name这样的方式。
需要注意的是,如果结构体中有多个 匿名字段,并且它们拥有相同的字段名,那么在访问这个同名字段时,需要指定嵌套结构体的类型,以避免歧义。例如:
  1. // 人
  2. type Person struct {
  3.   Name  string
  4.   Phone string
  5. }
  6. // 打篮球
  7. func (p *Person) playBasketball() {
  8.   fmt.Println("Person打篮球...")
  9. }
  10. // 联系方式
  11. type Contact struct {
  12.   Phone string
  13. }
  14. func (c Contact) playBasketball() {
  15.   fmt.Println("Contact打篮球...")
  16. }
  17. // 员工
  18. type Employee struct {
  19.   Person
  20.   EmployeeId int
  21.   Contact
  22. }
  23. // 测试匿名字段
  24. func TestAnonymous(t *testing.T) {
  25.   emp := Employee{
  26.     Person: Person{
  27.       Name:  "baily",
  28.       Phone: "18899999999",
  29.     },
  30.     EmployeeId: 1,
  31.     Contact: Contact{
  32.       Phone: "16611111111",
  33.     },
  34.   }
  35.   // 可直接使用emp调用出嵌入类型的方法
  36.   // 多个嵌入类型的方法名相同时,需要指定匿名字段的类型
  37.   //emp.playBasketball() // 这里就会报错
  38.   emp.Person.playBasketball()
  39.   emp.Contact.playBasketball()
  40.   // 可直接使用emp打印出嵌入类型的所有字段
  41.   fmt.Println("id: ", emp.EmployeeId)
  42.   fmt.Println("name: " + emp.Name)
  43.   // 多个嵌入类型的字段名相同时,需要指定匿名字段的类型
  44.   //fmt.Println("name: " + emp.Phone) // 这里就会报错
  45.   fmt.Println("name: " + emp.Person.Phone)
  46.   fmt.Println("name: " + emp.Contact.Phone)
  47. }
复制代码
在这个例子中,Person 和 Contact 都有 Phone 字段,因此在访问时需要指定具体的类型以避免歧义。
同样的,Person 和 Contact 都有 playbasketball 方法,因此在访问时也需要指定具体的类型以避免歧义。
如果不指定则会编译报错,如下:

4、总结

本篇完结!感谢你的阅读,欢迎点赞 关注 收藏 私信!!!
原文链接:https://mp.weixin.qq.com/s/JCFxSG7w6vRJeQS-j9R4yg


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4