当前位置:   article > 正文

Golang Struct 继承的深入讨论和细节_go 多个struct 继承

go 多个struct 继承

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

  1. type A struct {
  2. Name string
  3. age int
  4. }
  5. func (a *A) SayName() {
  6. fmt.Println("A say name", a.Name)
  7. }
  8. func (a *A) sayAge() {
  9. fmt.Println("A say age", a.age)
  10. }
  11. type B struct {
  12. sex string
  13. A
  14. }
  15. func main() {
  16. b := &B{
  17. sex: "male",
  18. A: A{
  19. Name: "lucas",
  20. age: 29,
  21. },
  22. }
  23. b.SayName()
  24. b.A.sayAge()
  25. fmt.Println(b.Name)
  26. fmt.Println(b.age)
  27. }

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

对上面的代码小结

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

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

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

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

  1. type A struct {
  2. Name string
  3. age int
  4. }
  5. func (a *A) SayName() {
  6. fmt.Println("A say name", a.Name)
  7. }
  8. func (a *A) sayAge() {
  9. fmt.Println("A say age", a.age)
  10. }
  11. type B struct {
  12. sex string
  13. Name string
  14. A
  15. }
  16. func (b *B) SayName() {
  17. fmt.Println("B say name", b.Name)
  18. }
  19. func main() {
  20. b := &B{
  21. sex: "male",
  22. Name: "jerry",
  23. A: A{
  24. Name: "lucas",
  25. age: 29,
  26. },
  27. }
  28. b.SayName()
  29. fmt.Println(b.Name)
  30. }
  31. B say name jerry
  32. jerry

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

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

  1. type A struct {
  2. Name string
  3. age int
  4. }
  5. func (a *A) SayName() {
  6. fmt.Println("A say name", a.Name)
  7. }
  8. type B struct {
  9. Name string
  10. sex string
  11. }
  12. func (b *B) SayName() {
  13. fmt.Println("B say name", b.Name)
  14. }
  15. type C struct {
  16. A
  17. B
  18. }
  19. func main() {
  20. c := &C{
  21. A: A{
  22. Name: "lucas",
  23. age: 23,
  24. },
  25. B: B{
  26. Name: "jerry",
  27. sex: "male",
  28. },
  29. }
  30. c.A.SayName()
  31. fmt.Println(c.A.Name)
  32. }

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

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

  

 

多重继承说明


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

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

多重继承细节说明

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

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/羊村懒王/article/detail/714684
推荐阅读
相关标签
  

闽ICP备14008679号