1
1
# 2.4 struct类型
2
2
## struct
3
3
Go语言中,也和C或者其他语言一样,我们可以声明新的类型,作为其它类型的属性或字段的容器。例如,我们可以创建一个自定义类型` person ` 代表一个人的实体。这个实体拥有属性:姓名和年龄。这样的类型我们称之` struct ` 。如下代码所示:
4
+ ``` Go
4
5
5
6
type person struct {
6
7
name string
7
8
age int
8
9
}
10
+ ```
9
11
看到了吗?声明一个struct如此简单,上面的类型包含有两个字段
10
12
- 一个string类型的字段name,用来保存用户名称这个属性
11
13
- 一个int类型的字段age,用来保存用户年龄这个属性
12
14
13
15
如何使用struct呢?请看下面的代码
16
+ ``` Go
14
17
15
18
type person struct {
16
19
name string
@@ -22,6 +25,7 @@ Go语言中,也和C或者其他语言一样,我们可以声明新的类型
22
25
P .name = " Astaxie" // 赋值"Astaxie"给P的name属性.
23
26
P .age = 25 // 赋值"25"给变量P的age属性
24
27
fmt.Printf (" The person's name is %s " , P .name ) // 访问P的name属性.
28
+ ```
25
29
除了上面这种P的声明使用之外,还有另外几种声明使用方式:
26
30
27
31
- 1.按照顺序提供初始化值
@@ -37,6 +41,7 @@ Go语言中,也和C或者其他语言一样,我们可以声明新的类型
37
41
P := new(person)
38
42
39
43
下面我们看一个完整的使用struct的例子
44
+ ``` Go
40
45
41
46
package main
42
47
import " fmt"
@@ -81,13 +86,14 @@ Go语言中,也和C或者其他语言一样,我们可以声明新的类型
81
86
fmt.Printf (" Of %s and %s , %s is older by %d years\n " ,
82
87
bob.name , paul.name , bp_Older.name , bp_diff)
83
88
}
84
-
89
+ ```
85
90
### struct的匿名字段
86
91
我们上面介绍了如何定义一个struct,定义的时候是字段名与其类型一一对应,实际上Go支持只提供类型,而不写字段名的方式,也就是匿名字段,也称为嵌入字段。
87
92
88
93
当匿名字段是一个struct的时候,那么这个struct所拥有的全部字段都被隐式地引入了当前定义的这个struct。
89
94
90
95
让我们来看一个例子,让上面说的这些更具体化
96
+ ``` Go
91
97
92
98
package main
93
99
import " fmt"
@@ -125,19 +131,21 @@ Go语言中,也和C或者其他语言一样,我们可以声明新的类型
125
131
mark.weight += 60
126
132
fmt.Println (" His weight is" , mark.weight )
127
133
}
128
-
134
+ ```
129
135
图例如下:
130
136
131
137
![ ] ( images/2.4.student_struct.png?raw=true )
132
138
133
139
图2.7 struct组合,Student组合了Human struct和string基本类型
134
140
135
141
我们看到Student访问属性age和name的时候,就像访问自己所有用的字段一样,对,匿名字段就是这样,能够实现字段的继承。是不是很酷啊?还有比这个更酷的呢,那就是student还能访问Human这个字段作为字段名。请看下面的代码,是不是更酷了。
142
+ ``` Go
136
143
137
144
mark.Human = Human {" Marcus" , 55 , 220 }
138
145
mark.Human .age -= 1
139
-
146
+ ```
140
147
通过匿名访问和修改字段相当的有用,但是不仅仅是struct字段哦,所有的内置类型和自定义类型都是可以作为匿名字段的。请看下面的例子
148
+ ``` Go
141
149
142
150
package main
143
151
import " fmt"
@@ -175,14 +183,15 @@ Go语言中,也和C或者其他语言一样,我们可以声明新的类型
175
183
jane.int = 3
176
184
fmt.Println (" Her preferred number is" , jane.int )
177
185
}
178
-
186
+ ```
179
187
从上面例子我们看出来struct不仅仅能够将struct作为匿名字段、自定义类型、内置类型都可以作为匿名字段,而且可以在相应的字段上面进行函数操作(如例子中的append)。
180
188
181
189
这里有一个问题:如果human里面有一个字段叫做phone,而student也有一个字段叫做phone,那么该怎么办呢?
182
190
183
191
Go里面很简单的解决了这个问题,最外层的优先访问,也就是当你通过` student.phone ` 访问的时候,是访问student里面的字段,而不是human里面的字段。
184
192
185
193
这样就允许我们去重载通过匿名字段继承的一些字段,当然如果我们想访问重载后对应匿名类型里面的字段,可以通过匿名字段名来访问。请看下面的例子
194
+ ``` Go
186
195
187
196
package main
188
197
import " fmt"
@@ -205,7 +214,7 @@ Go里面很简单的解决了这个问题,最外层的优先访问,也就是
205
214
// 如果我们要访问Human的phone字段
206
215
fmt.Println (" Bob's personal phone is:" , Bob.Human .phone )
207
216
}
208
-
217
+ ```
209
218
210
219
## links
211
220
* [ 目录] ( < preface.md > )
0 commit comments