【25.1】Go语言结构体(struct)

1.定义结构体与实例化
结构体是由一系列相同类型或不同类型的数据构成的数据集合。
结构体的定义格式,具体示例如下。

type 类型名 struct {
成员属性1 类型1
成员属性2 类型2
成员属性3  成员属性4 类型3
...
}

在使用结构体的过程中注意以下 3 点。
• 类型名是标识结构体的名称,在同一个包内不能重复。
• 结构体的属性,也叫字段,必须唯一。
• 同类型的成员属性可以写在一行。
结构体的定义只是一种内存布局的描述,只有当结构体实例化时,才会真正分配内存。因此只有在定义结构体并实例化后才能使用结构体。
实例化就是根据结构体定义的格式创建一份与格式一致的内存区域。结构体每个实例的内存是完全独立的。

基本的实例化形式:
结构体本身是一种类型,可以像整型、字符串等类型一样,以 var 的方式声明结构体即可完成实例化。
基本实例化格式如下:

var ins T

其中,T 为结构体类型,ins 为结构体的实例。

创建指针类型的结构体:
Go语言中,还可以使用 new 关键字对类型(包括结构体、整型、浮点数、字符串等)进行实例化,结构体在实例化后会形成指针类型的结构体。
使用 new 的格式如下:

ins := new(T)

其中:
T 为类型,可以是结构体、整型、字符串等。
ins:T 类型被实例化后保存到 ins 变量中,ins 的类型为 *T,属于指针。

取结构体的地址实例化:
在Go语言中,对结构体进行&取地址操作时,视为对该类型进行一次 new 的实例化操作,取地址格式如下:

ins := &T{}

其中:
T 表示结构体类型。
ins 为结构体的实例,类型为 *T,是指针类型。

使用“键值对”初始化结构体
结构体可以使用“键值对”(Key value pair)初始化字段,每个“键”(Key)对应结构体中的一个字段,键的“值”(Value)对应字段需要初始化的值。
键值对的填充是可选的,不需要初始化的字段可以不填入初始化列表中。
结构体实例化后字段的默认值是字段类型的默认值,例如 ,数值为 0、字符串为 ""(空字符串)、布尔为 false、指针为 nil 等。

  1. 键值对初始化结构体的书写格式:
ins := 结构体类型名{
    字段1: 字段1的值,
    字段2: 字段2的值,
    …
}                 //键值之间以:分隔,键值对之间以,分隔。

下面是对各个部分的说明:
结构体类型:定义结构体时的类型名称。
字段1、字段2:结构体成员的字段名,结构体类型名的字段初始化列表中,字段名只能出现一次。
字段1的值、字段2的值:结构体成员字段的初始值。

  1. 使用键值对填充结构体的例子
    下面示例中描述了家里的人物关联,正如儿歌里唱的:“爸爸的爸爸是爷爷”,人物之间可以使用多级的 child 来描述和建立关联,使用键值对形式填充结构体的代码如下:
type People struct {
    name  string
    child *People           //结构体的结构体指针字段,类型是 *People。
}
relation := &People{    //relation 由 People 类型取地址后,形成类型为 *People 的实例。
    name: "爷爷",
    child: &People{     //child 在初始化时,需要 *People 类型的值,使用取地址初始化一个 People。
        name: "爸爸",
        child: &People{
                name: "我",
        },
    },
}

Go语言可以在“键值对”初始化的基础上忽略“键”,也就是说,可以使用多个值的列表初始化结构体的字段。
提示:结构体成员中只能包含结构体的指针类型,包含非指针类型会引起编译错误。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容