• Golang 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)为了保证代码的简洁性,建议大家尽量不使用多重继承

  • 相关阅读:
    收集产品需求的9个渠道
    Android学习笔记 60. 探索文档和其他资源
    Lumos-az/MiniSQL阅读笔记
    DPDK 数据传输流程
    MySql 数据库【表】
    HDFS磁盘满额导致Hive写入失败
    OpenAI 函数调用教程
    Mysql索引
    PyTorch0.4.1 GPU版本安装完整步骤(Anaconda3 + Python3.6 + gpu版本,含CUDA9.2安装、环境配置)
    python系列笔记——常见运算符:算术运算符、比较运算符、赋值运算符、位运算符、逻辑运算符、成员运算符、身份运算符,及真题
  • 原文地址:https://blog.csdn.net/qq_34556414/article/details/134044305