go结构体嵌套和用结构体实现模拟“继承”

简介: 什么是结构体嵌套一个结构体中可以嵌套包含另一个结构体或结构体指针

什么是结构体嵌套

一个结构体中可以嵌套包含另一个结构体或结构体指针

结构体嵌套

package main

import "fmt"

// 桌子结构体
type table struct {
   
    material string
    shape int
    com common // 嵌套结构体
}

// 被嵌套的结构体定义
type common struct {
   
    year int
}

func main() {
   
    // 嵌套结构体定义和输出方法
    s1 := table{
   
        material: "木头",
        shape: 5,
        com: common{
   
            year: 2000,
        },
    }
    fmt.Println(s1.com.year)
}

匿名结构体嵌套

package main

import "fmt"

// 狗结构体
type dog struct {
   
    name string
    varieties string
    common // 嵌套匿名结构体
}

// 被嵌套的结构体定义
type common struct {
   
    year int
}

func main() {
   
    // 匿名嵌套结构体定义和输出方法
    s2 := dog{
   
        name:      "布迪",
        varieties: "柴犬",
        common: common{
   
            year: 2019,
        },
    }
    fmt.Println(s2.year) // 直接输出
    fmt.Println(s2.common.year) // 寻址输出
}

当访问结构体成员时会先在结构体中查找该字段,找不到再去嵌套的匿名字段中查找。

嵌套结构体的字段名冲突

嵌套结构体内部可能存在相同的字段名。在这种情况下为了避免歧义需要通过指定具体的内嵌结构体字段名。

//Address 地址结构体
type Address struct {
   
    Province   string
    City       string
    CreateTime string
}

//Email 邮箱结构体
type Email struct {
   
    Account    string
    CreateTime string
}

//User 用户结构体
type User struct {
   
    Name   string
    Gender string
    Address
    Email
}

func main() {
   
    var user3 User
    user3.Name = "沙河娜扎"
    user3.Gender = "男"
    // user3.CreateTime = "2019" //ambiguous selector user3.CreateTime
    user3.Address.CreateTime = "2000" //指定Address结构体中的CreateTime
    user3.Email.CreateTime = "2000"   //指定Email结构体中的CreateTime
}

用结构体嵌套模拟实现“继承”

由于golang语言不支持继承 所以我用结构体嵌套实现一个简单的继承效果

例子解释:

  • 首先定义了一个动物园zoo的结构体
  • 给动物园zoo结构体定义了一个 run的方法
  • 然后定义了一个狗的结构体dog,并且在这个结构体里面匿名嵌套了 zoo 动物园结构体
  • 给狗结构体dog定义了一个 foot 的方法

要实现的是在dog结构体里调用给zoo结构体定义的方法

代码示例

package main

import "fmt"

// 动物园结构体
type zoo struct {
   
    name string
}
// zoo 的 run 方法
func (z *zoo) run()  {
   
    fmt.Printf("这个动物的名字叫:%s \n", z.name)
}

// 狗结构体
type dog struct {
   
    footer int
    zoo
}
// dog 的 foot 方法
func (d *dog) foot()  {
   
    fmt.Printf("这个狗有 %d 条腿 \n", d.footer)
}

func main() {
   
    s1 := &dog{
   
        footer: 4,
        zoo: zoo{
   name: "布迪"},
    }
    fmt.Println(s1)
    s1.run()
    s1.foot()
}
&{4 {布迪}}
这个动物的名字叫:布迪
这个狗有 4 条腿
相关文章
|
6天前
|
存储 Rust Go
Go nil 空结构体 空接口有什么区别?
本文介绍了Go语言中的`nil`、空结构体和空接口的区别。`nil`是预定义的零值变量,适用于指针、管道等类型;空结构体大小为0,多个空结构体实例指向同一地址;空接口由`_type`和`data`字段组成,仅当两者均为`nil`时,空接口才为`nil`。
Go nil 空结构体 空接口有什么区别?
|
2月前
|
Go
Go to Learn Go之结构体
Go to Learn Go之结构体
37 5
|
2月前
|
存储 Shell Go
Go语言结构体和元组全面解析
Go语言结构体和元组全面解析
|
2月前
|
存储 Go
Go: struct 结构体类型和指针【学习笔记记录】
本文是Go语言中struct结构体类型和指针的学习笔记,包括结构体的定义、成员访问、使用匿名字段,以及指针变量的声明使用、指针数组定义使用和函数传参修改值的方法。
|
3月前
|
存储 设计模式 安全
空结构体:Go 语言中的轻量级占位符
【8月更文挑战第31天】
39 0
|
3月前
|
存储 Java Go
Go从入门到放弃之结构体(面向对象)
Go从入门到放弃之结构体(面向对象)
|
3月前
|
存储 Go
Go 内存分配:结构体中的优化技巧
Go 内存分配:结构体中的优化技巧
|
3月前
|
Go
Go 语言中的“继承”:使用结构体实现代码重用
Go 语言中的“继承”:使用结构体实现代码重用
35 0
|
4月前
|
Go 索引
go语言结构体使用小结
go语言结构体使用小结
37 0
|
5月前
|
Go
go反射获取变量类型、值、结构体成员、结构体方法
go反射获取变量类型、值、结构体成员、结构体方法