结构体中的string自动初始化_「GCTT 出品」Go 系列教程——16. 结构体,这一篇就够...

Go语言中文网,致力于每日分享编码知识,欢迎关注我,会有意想不到的收获!

7db68115a470db66ae1270e663c1036b.png

Go 系列教程是非常棒的一套初学者教程,入门就它了。

「GCTT 出品」Go 系列教程——1. 介绍与安装

「GCTT 出品」Go 系列教程——2. Hello World

「GCTT 出品」Go 系列教程——3. 变量

「GCTT 出品」Go 系列教程——4. 类型

「GCTT 出品」Go 系列教程——5. 常量

「GCTT 出品」Go 系列教程——6. 函数(Function)

「GCTT 出品」Go 系列教程——7. 包

Go 系列教程——8. if-else 语句

「GCTT 出品」Go 系列教程——9. 循环

「GCTT 出品」Go 系列教程——10. switch 语句

「GCTT 出品」Go 系列教程——11. 数组和切片

「GCTT 出品」Go 系列教程——12. 可变参数函数

「GCTT 出品」Go 系列教程——13. Maps

「GCTT 出品」Go 系列教程——14. 字符串

「GCTT 出品」Go 系列教程——15. 指针

这是 Golang 系列教程中的第 16 篇。在本章教程中,我们将讨论 Go 语言中结构体。

01 什么是结构体?

结构体是用户定义的类型,表示若干个字段(Field)的集合。有时应该把数据整合在一起,而不是让这些数据没有联系。这种情况下可以使用结构体。

例如,一个职员有 firstName、lastName 和 age 三个属性,而把这些属性组合在一个结构体 employee 中就很合理。

02 结构体的声明

type Employee struct { firstName string lastName string age int}

在上面的代码片段里,声明了一个结构体类型 Employee,它有 firstName、lastName 和 age 三个字段。通过把相同类型的字段声明在同一行,结构体可以变得更加紧凑。在上面的结构体中,firstName 和 lastName 属于相同的 string 类型,于是这个结构体可以重写为:

type Employee struct { firstName, lastName string age, salary int}

上面的结构体 Employee 称为 命名的结构体(Named Structure)。我们创建了名为 Employee 的新类型,而它可以用于创建 Employee 类型的结构体变量。

声明结构体时也可以不用声明一个新类型,这样的结构体类型称为 匿名结构体(Anonymous Structure)

var employee struct { firstName, lastName string age int}

上述代码片段创建一个匿名结构体 employee。

03 创建命名的结构体

通过下面代码,我们定义了一个命名的结构体 Employee

3505d93f1ca0b9da0a5a224bfde6fce3.png

在上述程序的第 7 行,我们创建了一个命名的结构体 Employee。而在第 15 行,通过指定每个字段名的值,我们定义了结构体变量 emp1。字段名的顺序不一定要与声明结构体类型时的顺序相同。在这里,我们改变了 lastName 的位置,将其移到了末尾。这样做也不会有任何的问题。

在上面程序的第 23 行,定义 emp2 时我们省略了字段名。在这种情况下,就需要保证字段名的顺序与声明结构体时的顺序相同。

该程序将输出:

Employee 1 {Sam Anderson 25 500}Employee 2 {Thomas Paul 29 800}

04 创建匿名结构体

189ab900fff685585daf92cd47d0cdaf.png

在上述程序的第 3 行,我们定义了一个匿名结构体变量 emp3。上面我们已经提到,之所以称这种结构体是匿名的,是因为它只是创建一个新的结构体变量 em3,而没有定义任何结构体类型。

该程序会输出:

Employee 3 {Andreah Nikola 31 5000}

05 结构体的零值(Zero Value)

当定义好的结构体并没有被显式地初始化时,该结构体的字段将默认赋为零值。

bb39ffefe1559faaa7bf82c3abb8d71c.png

该程序定义了 emp4,却没有初始化任何值。因此 firstName 和 lastName 赋值为 string 的零值("")。而 age 和 salary 赋值为 int 的零值(0)。该程序会输出:

Employee 4 { 0 0}

当然还可以为某些字段指定初始值,而忽略其他字段。这样,忽略的字段名会赋值为零值。

aa31093c01a72db2e61489949db28ddd.png

在上面程序中的第 14 行和第 15 行,我们初始化了 firstName 和 lastName,而 age 和 salary 没有进行初始化。因此 age 和 salary 赋值为零值。该程序会输出:

Employee 5 {John Paul 0 0}

06 访问结构体的字段

点号操作符 . 用于访问结构体的字段。

18ad04104aa6295f3be6b7a0a210131e.png

上面程序中的 emp6.firstName 访问了结构体 emp6 的字段 firstName。该程序输出:

First Name: Sam Last Name: Anderson Age: 55 Salary: $6000

还可以创建零值的 struct,以后再给各个字段赋值。

c074ff9a6504c05db2a939d1a1c1a706.png

在上面程序中,我们定义了 emp7,接着给 firstName 和 lastName 赋值。该程序会输出:

Employee 7: {Jack Adams 0 0}

07 结构体的指针

还可以创建指向结构体的指针。

2a63de67ebef00a73fb911f5c3bb2191.png

在上面程序中,emp8 是一个指向结构体 Employee 的指针。(*emp8).firstName 表示访问结构体 emp8 的 firstName 字段。该程序会输出:

First Name: SamAge: 55

Go 语言允许我们在访问 firstName 字段时,可以使用 emp8.firstName 来代替显式的解引用 (*emp8).firstName

e8203f007f3b50710ff52f6f2346ef2e.png

在上面的程序中,我们使用 emp8.firstName 来访问 firstName 字段,该程序会输出:

First Name: SamAge: 55

08 匿名字段

当我们创建结构体时,字段可以只有类型,而没有字段名。这样的字段称为匿名字段(Anonymous Field)。

以下代码创建一个 Person 结构体,它含有两个匿名字段 string 和 int。

type Person struct {  string int}

我们接下来使用匿名字段来编写一个程序。

2efe2643060ad7d4234be185a2104637.png

在上面的程序中,结构体 Person 有两个匿名字段。p := Person{"Naveen

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值