统一练习的格式

This commit is contained in:
leisore
2015-08-13 16:22:25 +08:00
parent 5b46c7b4ec
commit 5a7e188727
3 changed files with 16 additions and 8 deletions

View File

@@ -1,8 +1,8 @@
# 10 结构struct与方法method # 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中结构体有着更为重要的地位。 结构体的概念在软件工程上旧的术语叫ADT(抽象数据类型Abstract Data Type),在一些老的编程语言中叫*记录(Record)*比如Cobol在C家族的编程语言中它也存在并且名字也是*struct*在面向对象的编程语言中跟一个无方法的轻量级类一样。不过因为Go语言中没有类的概念因此在Go中结构体有着更为重要的地位。

View File

@@ -12,7 +12,7 @@ type identifier struct {
`type T struct {a, b int}`也是合法的语法,它更适用于简单的结构体。 `type T struct {a, b int}`也是合法的语法,它更适用于简单的结构体。
这个结构体里的字段都有*名字*像field1field2等如果字段在代码中从来也不会被用到那么可以命名它为*_*。 结构体里的字段都有*名字*像field1field2等如果字段在代码中从来也不会被用到那么可以命名它为*_*。
结构体的字段可以是任何类型,甚至是结构体本身(参考[10.5](10.5.md)可以是函数或者接口参考第11章。可以声明结构体类型的一个变量然后给它的字段像下面这样赋值 结构体的字段可以是任何类型,甚至是结构体本身(参考[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中呢 VCard必须包含住址它应该以值类型还是以指针类型放在VCard中呢
第二种会好点因为它占用内存少。包含一个名字和两个指向地址的指针的Address结构体可以使用%v打印 第二种会好点因为它占用内存少。包含一个名字和两个指向地址的指针的Address结构体可以使用%v打印
{Kersschot 0x126d2b80 0x126d2be0} {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 factor
*练习 10.3* rectangle.go定义一个Rectangle结构体它的长和宽是int类型并定义方法Area()和Primeter(),然后进行测试。 练习 10.3 rectangle.go
定义一个Rectangle结构体它的长和宽是int类型并定义方法Area()和Primeter(),然后进行测试。
## 链接 ## 链接
- [目录](directory.md) - [目录](directory.md)

View File

@@ -88,7 +88,7 @@ func main() {
1 2 3 4 1 2 3 4
{1 2} {1 2}
*练习 10.5* anonymous_struct.go 练习 10.5 anonymous_struct.go
创建一个结构体它有一个具名的float字段2个匿名字段类型分别是int和string。通过结构体字面量新建一个结构体实例并打印它的内容。 创建一个结构体它有一个具名的float字段2个匿名字段类型分别是int和string。通过结构体字面量新建一个结构体实例并打印它的内容。