Golang Struct 继承的深入讨论和细节

1)结构体可以使用嵌套匿名结构体所有的字段和方法,即:首字母大写或者小写的字段、方法,都可以使用。

type A struct {
	Name string
	age  int
}

func (a *A) SayName() {
	fmt.Println("A say name", a.Name)
}

func (a *A) sayAge() {
	fmt.Println("A say age", a.age)
}

type B struct {
	sex string
	A
}

func main() {
	b := &B{
		sex: "male",
		A: A{
			Name: "lucas",
			age:  29,
		},
	}
	b.SayName()
	b.A.sayAge()
	fmt.Println(b.Name)
	fmt.Println(b.age)
}

2)匿名结构体字段访问可以简化,如图

对上面的代码小结

(1)当我们直接通过b 访问字段或方法时,其执行流程如下,比如b.Name

(2)编译器会先看b对应的类型有没有Name,如果有,则直接调用B类型的Name字段

(3)如果没有就去看B中嵌入的匿名结构体A有没有声明Name字段,如果有就调用,如果没有继续查找..........如果都找不到就报错(如果A里面还有嵌入结构体那么就可以调用)

(4)当结构体和匿名结构体有相同的字段或者方法时,编译器采用就近访问原则访问,如希望访问匿名结构体的字段和方法可以通过匿名结构体名来区分

type A struct {
	Name string
	age  int
}

func (a *A) SayName() {
	fmt.Println("A say name", a.Name)
}

func (a *A) sayAge() {
	fmt.Println("A say age", a.age)
}

type B struct {
	sex  string
	Name string
	A
}

func (b *B) SayName() {
	fmt.Println("B say name", b.Name)
}

func main() {
	b := &B{
		sex:  "male",
		Name: "jerry",
		A: A{
			Name: "lucas",
			age:  29,
		},
	}
	b.SayName()
	fmt.Println(b.Name)
}


B say name jerry
jerry

可以看到B在找字段的时候已经找到了自身的字段Name,那么就不会去找A里面的Name字段。

(5)结构体嵌入两个(或多个)匿名结构体,如两个匿名结构体有相同的字段和方法(同时结构体本身没有同名的字段和方法),在访问时,就必须明确指定匿名结构体名字,否则编译报错。

type A struct {
	Name string
	age  int
}

func (a *A) SayName() {
	fmt.Println("A say name", a.Name)
}

type B struct {
	Name string
	sex  string
}

func (b *B) SayName() {
	fmt.Println("B say name", b.Name)
}

type C struct {
	A
	B
}

func main() {
	c := &C{
		A: A{
			Name: "lucas",
			age: 23,
		},
		B: B{
			Name: "jerry",
			sex: "male",
		},
	}
	
	c.A.SayName()
	fmt.Println(c.A.Name)
}

(6)如果一个struct嵌套了一个有名结构体,这种模式就是组合,如果是组合关系,那么在访问组合的结构体的字段或方法时,必须带上结构体的名字

(7)嵌套匿名结构体后,也可以在创建结构体变量(实例)时,直接指定各个匿名结构体字段的值。

  

 

多重继承说明


如一个struct嵌套了多个匿名结构体,那么该结构体可以直接访问嵌套的匿名结构体的字段和方法,从而实现了多重继承。

TV里面既可以使用Goods里面的属性和方法,同时也可以使用Brand里面的属性和方法。 

多重继承细节说明

1)如嵌入的匿名结构体有相同的字段名或者方法名,则在访问时,需要通过匿名结构体类型名来区分。

2)为了保证代码的简洁性,建议大家尽量不使用多重继承

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
回答: 在Go语言中,struct是一种数据类型,用于定义自定义的复合数据结构。struct可以包含多个字段,每个字段都有自己的类型和名称。可以使用struct关键字来定义一个struct类型,并在大括号内定义字段。\[1\]在struct中,还可以使用内嵌结构体的方式来组织数据。内嵌结构体是指在一个结构体中嵌入另一个结构体作为其字段。这样可以实现结构体的组合和复用。\[2\]在使用struct时,可以使用简洁的语法格式来创建和初始化结构体变量。可以使用结构体类型名加大括号的方式来创建一个结构体变量,并为每个字段赋值。也可以使用键值对的方式来指定字段的值。\[3\] #### 引用[.reference_title] - *1* *3* [Golang 结构体](https://blog.csdn.net/weixin_47243236/article/details/122028539)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [Golang 入门 : 结构体(struct)](https://blog.csdn.net/weixin_30753873/article/details/97302216)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值