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 条腿 
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

汀风说后端

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值