06 | struct 和 interface:结构体与接口都实现了哪些功能?

06 | struct 和 interface:结构体与接口都实现了哪些功能?结构体结构体定义结构体是一种聚合类型,里面可以包含任意类型的值,这些值就是我们定义的结构体的成员,也称为字段。在 Go 语言中,要自定义一个结构体,需要使用 type+struct 关键字组合。在下面的例子中,我自定义了一个结构体类型,名称为 person,表示一个人。这个 person 结构体有两个字段:name 代表这个人的名字,age 代表这个人的年龄。type person struct { name s
摘要由CSDN通过智能技术生成

06 | struct 和 interface:结构体与接口都实现了哪些功能?

结构体

结构体定义

结构体是一种聚合类型,里面可以包含任意类型的值,这些值就是我们定义的结构体的成员,也称为字段。在 Go 语言中,要自定义一个结构体,需要使用 type+struct 关键字组合。

在下面的例子中,我自定义了一个结构体类型,名称为 person,表示一个人。这个 person 结构体有两个字段:name 代表这个人的名字,age 代表这个人的年龄。

type person struct {
   
    name string
    age uint
}

在定义结构体时,字段的声明方法和平时声明一个变量是一样的,都是变量名在前,类型在后,只不过在结构体中,变量名称为成员名或字段名。

结构体的成员字段并不是必需的,也可以一个字段都没有,这种结构体成为空结构体。

根据以上信息,我们可以总结出结构体定义的表达式,如下面的代码所示:

type structName struct{
   
    fieldName typeName
    ....
    ....
}

其中:

  • type 和 struct 是 Go 语言的关键字,二者组合就代表要定义一个新的结构体类型。

  • structName 是结构体类型的名字。

  • fieldName 是结构体的字段名,而 typeName 是对应的字段类型。

  • 字段可以是零个、一个或者多个。

小提示:结构体也是一种类型,所以以后自定义的结构体,我会称为某结构体或某类型,两者是一个意思。比如 person 结构体和 person 类型其实是一个意思。

定义好结构体后就可以使用了,因为它是一个聚合类型,所以比普通的类型可以携带更多数据。

结构体声明使用

结构体类型和普通的字符串、整型一样,也可以使用同样的方式声明和初始化。

在下面的例子中,我声明了一个 person 类型的变量 p,因为没有对变量 p 初始化,所以默认会使用结构体里字段的零值。

var p person

当然在声明一个结构体变量的时候,也可以通过结构体字面量的方式初始化,如下面的代码所示:

p:=person{
   "飞雪无情",30}

采用简短声明法,同时采用字面量初始化的方式,把结构体变量 p 的 name 初始化为“飞雪无情”,age 初始化为 30,以逗号分隔。

声明了一个结构体变量后就可以使用了,下面我们运行以下代码,验证 name 和 age 的值是否和初始化的一样。

fmt.Println(p.name,p.age)

在 Go 语言中,访问一个结构体的字段和调用一个类型的方法一样,都是使用点操作符“.”。

采用字面量初始化结构体时,初始化值的顺序很重要,必须和字段定义的顺序一致。

在 person 这个结构体中,第一个字段是 string 类型的 name,第二个字段是 uint 类型的 age,所以在初始化的时候,初始化值的类型顺序必须一一对应,才能编译通过。也就是说,在示例 {“飞雪无情”,30} 中,表示 name 的字符串飞雪无情必须在前,表示年龄的数字 30 必须在后。

那么是否可以不按照顺序初始化呢?当然可以,只不过需要指出字段名称,如下所示:

p:=person{
   age:30,name:"飞雪无情"}

其中,第一位我放了整型的 age,也可以编译通过,因为采用了明确的 field:value 方式进行指定,这样 Go 语言编译器会清晰地知道你要初始化哪个字段的值。

有没有发现,这种方式和 map 类型的初始化很像,都是采用冒号分隔。Go 语言尽可能地重用操作,不发明新的表达式,便于我们记忆和使用。

当然你也可以只初始化字段 age,字段 name 使用默认的零值,如下面的代码所示,仍然可以编译通过。

p:=person{
   age:30}
字段结构体

结构体的字段可以是任意类型,也包括自定义的结构体类型,比如下面的代码:

type person struct {
   
    name string
    age uint
    addr address
}
type address struct {
   
    province string
    city string
}

在这个示例中,我定义了两个结构体:person 表示人,address 表示地址。在结构体 person 中,有一个 address 类型的字段 addr,这就是自定义的结构体。

通过这种方式,用代码描述现实中的实体会更匹配,复用程度也更高。对于嵌套结构体字段的结构体,其初始化和正常的结构体大同小异,只需要根据字段对应的类型初始化即可,如下面的代码所示:

    p
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值