mirror of
https://github.com/unknwon/the-way-to-go_ZH_CN.git
synced 2025-08-12 03:32:05 +08:00
统一练习的格式
This commit is contained in:
@@ -1,8 +1,8 @@
|
||||
# 10 结构(struct)与方法(method)
|
||||
|
||||
Go通过类型别名(alias types)或结构体的形式支持用户自定义类型,或者叫定制类型。一个带属性的结构体试图表示一个现实世界中的实体。结构体是复合类型(omposite types),当需要定义一个类型,它由一系列属性组成,每个属性都有自己的类型和值的时候,就应该使用结构体,它把数据聚集在一起。然后可以访问这些数据,就好像它是一个独立实体的一部分。
|
||||
Go通过类型别名(alias types)和结构体的形式支持用户自定义类型,或者叫定制类型。一个带属性的结构体试图表示一个现实世界中的实体。结构体是复合类型(composite types),当需要定义一个类型,它由一系列属性组成,每个属性都有自己的类型和值的时候,就应该使用结构体,它把数据聚集在一起。然后可以访问这些数据,就好像它是一个独立实体的一部分。结构体也是值类型,因此可以通过**new**方法来创建。
|
||||
|
||||
组成结构体类型的那些数据称为 *字段(fields)*。一个字段有一个类型和一个名字;在一个结构体中,字段名字必须是唯一的。
|
||||
组成结构体类型的那些数据称为 *字段(fields)*。每个字段都有一个类型和一个名字;在一个结构体中,字段名字必须是唯一的。
|
||||
|
||||
结构体的概念在软件工程上旧的术语叫ADT(抽象数据类型:Abstract Data Type),在一些老的编程语言中叫*记录(Record)*,比如Cobol,在C家族的编程语言中它也存在,并且名字也是*struct*,在面向对象的编程语言中,跟一个无方法的轻量级类一样。不过因为Go语言中没有类的概念,因此在Go中结构体有着更为重要的地位。
|
||||
|
||||
|
@@ -12,7 +12,7 @@ type identifier struct {
|
||||
|
||||
`type T struct {a, b int}`也是合法的语法,它更适用于简单的结构体。
|
||||
|
||||
这个结构体里的字段都有*名字*,像field1,field2等,如果字段在代码中从来也不会被用到,那么可以命名它为*_*。
|
||||
结构体里的字段都有*名字*,像field1,field2等,如果字段在代码中从来也不会被用到,那么可以命名它为*_*。
|
||||
|
||||
结构体的字段可以是任何类型,甚至是结构体本身(参考[10.5](10.5.md)),可以是函数或者接口(参考第11章)。可以声明结构体类型的一个变量,然后给它的字段像下面这样赋值:
|
||||
|
||||
@@ -282,19 +282,27 @@ func main() {
|
||||
|
||||
**练习**
|
||||
|
||||
*练习 10.1* vcard.go:定义结构体Address和VCard,后者包含一个人的名字、地址编号、出生日期和图像,试着选择正确的数据类型。构建一个自己的vcard并打印它的内容。
|
||||
练习 10.1 vcard.go:
|
||||
|
||||
定义结构体Address和VCard,后者包含一个人的名字、地址编号、出生日期和图像,试着选择正确的数据类型。构建一个自己的vcard并打印它的内容。
|
||||
|
||||
提示:
|
||||
VCard必须包含住址,它应该以值类型还是以指针类型放在VCard中呢?
|
||||
第二种会好点,因为它占用内存少。包含一个名字和两个指向地址的指针的Address结构体可以使用%v打印:
|
||||
{Kersschot 0x126d2b80 0x126d2be0}
|
||||
|
||||
*练习 10.2* 修改*persionext1.go*,使它的参数upPerson不是一个指针,解释下二者的区别。
|
||||
练习 10.2 persionext1.go:
|
||||
|
||||
*练习 10.3* point.go:使用坐标X、Y定义一个二维Point结构体。同样地,对一个三维点使用它的极坐标定义一个Polar结构体。实现一个Abs()方法来计算一个Point表示的向量的长度,实现一个Scale方法,它将点的坐标乘以一个尺度因子(提示:使用math包里的Sqrt函数)( function Scale that multiplies the coordinates of a point with a scale
|
||||
修改persionext1.go,使它的参数upPerson不是一个指针,解释下二者的区别。
|
||||
|
||||
练习 10.3 point.go:
|
||||
|
||||
使用坐标X、Y定义一个二维Point结构体。同样地,对一个三维点使用它的极坐标定义一个Polar结构体。实现一个Abs()方法来计算一个Point表示的向量的长度,实现一个Scale方法,它将点的坐标乘以一个尺度因子(提示:使用math包里的Sqrt函数)( function Scale that multiplies the coordinates of a point with a scale
|
||||
factor)。
|
||||
|
||||
*练习 10.3* rectangle.go:定义一个Rectangle结构体,它的长和宽是int类型,并定义方法Area()和Primeter(),然后进行测试。
|
||||
练习 10.3 rectangle.go:
|
||||
|
||||
定义一个Rectangle结构体,它的长和宽是int类型,并定义方法Area()和Primeter(),然后进行测试。
|
||||
|
||||
## 链接
|
||||
- [目录](directory.md)
|
||||
|
@@ -88,7 +88,7 @@ func main() {
|
||||
1 2 3 4
|
||||
{1 2}
|
||||
|
||||
*练习 10.5* anonymous_struct.go
|
||||
练习 10.5 anonymous_struct.go:
|
||||
|
||||
创建一个结构体,它有一个具名的float字段,2个匿名字段,类型分别是int和string。通过结构体字面量新建一个结构体实例并打印它的内容。
|
||||
|
||||
|
Reference in New Issue
Block a user