Go语言结构体的嵌套 | 青训营笔记

358 阅读3分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 14 天

一、本堂课重点内容

本堂课的知识要点有哪些?

  • Go语言结构体的嵌套
  • Go语言匿名结构体

二、详细知识点介绍

本堂课介绍了哪些知识点?

Go语言结构体的嵌套

  1. 结构体作为一种复合数据类型,其中一个重要特性是可以为其添加方法,一个关联了方法的结构体就非常像一个带有方法的类,可以成为Go语言面向对象编程的基础。Go语言中虽然没有类的概念,也没有继承的概念,但却提供了结构体的嵌入,实现了类似继承的功能,因而也部分实现了面向对象的设计模式。
  2. Go语言语法允许结构体的字段名为空,但其数据类型不为空,称为匿名字段。在一个结构体中可以有多个匿名字段,但是,其数据类型必须不同。
  3. 需要注意的是,匿名字段不可以用空字符_代替,否则编译系统会报错:cannot use _ as value
  4. 一个嵌入的结构体等同于一个匿名字段。不过,同样要服从结构体定义的原则,一个结构体内不可以嵌入两个同名的结构体,内嵌结构体的名字也不可以与字段重名。嵌入的结构体如果带有方法,则方法也同时被嵌入。
  5. 结构体字段可以与其内嵌结构体中的字段同名。
  6. 如果内嵌的结构体带有方法,则方法的接受者仍然是内嵌的结构体。
  7. 外层结构体如果想使用内层结构体的方法则需要设置一个同名的方法,将内嵌的方法体添加到该方法中,并且还可以扩展该内嵌的方法。
  8. Go语言规定,一旦有字段重名,则外层字段覆盖内层字段,内层字段被隐藏,不可见。需要注意的是这种隐藏是覆盖多层次的,也就是任意深度的同名字段都被隐藏。字段重名只是其外在表现,各自的内存地址空间并不重叠。因此,通过结构体名称加.选择符仍然可以访问到内层结构体的字段成员。
  9. 字段会重名,方法也会重名,方法被隐藏后也需要用内层结构体名称加.选择符来引用。
  10. 如果同一嵌入层次的两个结构体中出现了同名的字段或方法,则编译系统无法确定是选择哪一个,导致编译出错。这时需要明确方法的接受者才可以正确调用方法。
  11. 在结构体类型声明中如果嵌入的不是其它结构体,而是自身,这种情况称为递归结构体类型。
  12. 递归结构体类型在定义链表或二叉树的元素时特别有用,此时定义的每个节点都有指向邻近节点的链接。

Go语言匿名结构体

  1. 匿名结构体也只是没有名字而已,其它的和命名结构体是一样的。匿名结构体不用关键字 type,其语法格式为:

    struct{
    	field1 type1
    	field2 type2
    	...
        fieldN typeN
    }
    
  2. 匿名结构体在类型特性和声明规则方面与命名结构体是完全一致的。匿名结构体就是定义了一个结构及内存分配方式,匿名结构体也是可以被用于变量声明的。

  3. 匿名结构体由于没有名字,所以一般不用于函数的形参声明,但用于一般的变量声明是可以的,如:

    var x struct{
        a int
        b string
    }
    

三、引用参考

我参考了哪些外部博客/笔记/文章?