11.手撕Go语言-结构体

结构体是由一些列属性组成的复合数据类型,每个属性都具有名称、类型和值,结构体将属性组合在一起进行由程序进行处理

自定义类型

在go语言中使用type声明一种新的类型,语法格式为:

11.01.png

Format可以时任意内置类型、函数签名、结构体、接口

11.02.png
11.03.png

定义

结构体定义使用struct标识,需要指定其包含的属性(名和类型),在定义结构体时可以为结构体指定结构体名(命名结构体),用于后续声明结构体变量使用

11.04.png

声明

声明结构体变量只需要定义变量类型为结构体名,变量中的每个属性被初始化为对应类型的零值。也可声明结构体指针变量,此时变量被初始化为nil

11.05.png

初始化

使用结构体创建的变量叫做对应结构体的实例或者对象

  1. 使用结构体零值初始化结构体值对象

    11.06.png
  2. 使用结构体字面量初始化结构体值对象

    11.07.png
  3. 使用new函数进行初始化结构体指针对象

    11.08.png
  4. 使用结构体字面量初始化结构体指针对象

    11.09.png

New函数

Go语言中常定义N(n)ew+结构体名命名的函数用于创建对应的结构体值对象或指针对象

11.10.png
11.11.png

属性的访问和修改

通过结构体对象名/结构体指针对象.属性名的方式来访问和修改对象的属性值

11.12.png
11.13.png

可以通过结构体指针对象的点操作直接对对象的属性值进行访问和修改

匿名结构体

在定义变量时将类型指定为结构体的结构,此时叫匿名结构体。匿名结构体常用于初始化一次结构体变量的场景,例如项目配置

11.14.png

命名嵌入

结构体命名嵌入是指结构体中的属性对应的类型也是结构体

定义

11.15.png

声明和初始化

11.16.png

属性的访问和修改

11.17.png

匿名嵌入

结构体匿名嵌入是指将已定义的结构体名直接声明在新的结构体中,从而实现对以后已有类型的扩展和修改

定义

11.18.png

声明&初始化

11.19.png
11.20.png

在初始化匿名嵌入的结构体对象时需要遵循树状声明的结构,对于匿名嵌入的结构体可以使用结构体名来指定初始化参数

属性访问和修改

11.21.png
11.22.png

在访问和修改嵌入结构体的属性值时,可以通过对象名.结构体名称.属性名的方式进行访问和修改,结构体名称可以省略(匿名成员有一个隐式的名称),因此不能嵌套两个相同名称的结构体。当被嵌入结构体和嵌入结构体有相同的属性名时,在访问和修改嵌入结构体成员的属性值时不能省略结构体名称

11.23.png
11.24.png

指针类型嵌入

结构体嵌入(命名&匿名)类型也可以为结构体指针

定义

11.25.png

声明&初始化&操作

11.26.png

使用属性为指针类型底层共享数据结构,当底层数据发生变化,所有引用都会发生影响

11.27.png

使用属性为值类型,则在复制时发生拷贝,两者不相互影响

可见性

结构体首字母大写则包外可见(公开的),否者仅包内可访问(内部的)

结构体属性名首字母大写包外可见(公开的),否者仅包内可访问(内部的)

组合:

  • 结构体名首字母大写,属性名大写:结构体可在包外使用,且访问其大写的属性名
  • 结构体名首字母大写,属性名小写:结构体可在包外使用,且不能访问其小写的属性名
  • 结构体名首字母小写,属性名大写:结构体只能在包内使用,属性访问在结构体嵌入时由被嵌入结构体(外层)决定,被嵌入结构体名首字母大写时属性名包外可见,否者只能在包内使用
  • 结构体名首字母小写,属性名小写:结构体只能在包内使用
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容