From 5a7e18872757d3d5b6da28409bb07dc139684c97 Mon Sep 17 00:00:00 2001 From: leisore Date: Thu, 13 Aug 2015 16:22:25 +0800 Subject: [PATCH] =?UTF-8?q?=E7=BB=9F=E4=B8=80=E7=BB=83=E4=B9=A0=E7=9A=84?= =?UTF-8?q?=E6=A0=BC=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- eBook/10.0.md | 4 ++-- eBook/10.1.md | 18 +++++++++++++----- eBook/10.5.md | 2 +- 3 files changed, 16 insertions(+), 8 deletions(-) diff --git a/eBook/10.0.md b/eBook/10.0.md index 77a290f..8850f72 100644 --- a/eBook/10.0.md +++ b/eBook/10.0.md @@ -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中结构体有着更为重要的地位。 diff --git a/eBook/10.1.md b/eBook/10.1.md index 380af11..00cf5fd 100644 --- a/eBook/10.1.md +++ b/eBook/10.1.md @@ -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) diff --git a/eBook/10.5.md b/eBook/10.5.md index eaf7c74..d7d34eb 100644 --- a/eBook/10.5.md +++ b/eBook/10.5.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。通过结构体字面量新建一个结构体实例并打印它的内容。