From efc961c20e362df64e4e9aaad786ce377b518275 Mon Sep 17 00:00:00 2001 From: leisore Date: Wed, 10 Jun 2015 15:39:38 +0800 Subject: [PATCH] * ch10.1 OK --- eBook/10.1.md | 98 ++++++++++++++++++++++++++++++++-- eBook/images/10.1_fig10.3.jpg | Bin 0 -> 7519 bytes eBook/images/10.1_fig10.4.jpg | Bin 0 -> 11593 bytes 3 files changed, 95 insertions(+), 3 deletions(-) create mode 100644 eBook/images/10.1_fig10.3.jpg create mode 100644 eBook/images/10.1_fig10.4.jpg diff --git a/eBook/10.1.md b/eBook/10.1.md index d97ae5c..bc3e8dd 100644 --- a/eBook/10.1.md +++ b/eBook/10.1.md @@ -209,11 +209,103 @@ type Rect2 struct {Min, Max *Point } **递归结构体** -**练习9.2** +结构体类型可以通过自身来定义。在结构体变量是链表或二叉树的元素(通常叫节点)时,这种方法会特别有用,此时节点包含指向临近节点的链接(地址)。如下所示,链表中的`su`,树中的`ri`h和`le`分别是指向另一个节点变量的指针。 -通过使用 unsafe 包中的方法来测试你电脑上一个整型变量占用多少个字节。 +链表: + +![](images/10.1_fig10.3.jpg?raw=true) + +这块的data域用于存放有些数据(比如float64),su指针指向后继节点。 + +Go代码: + +```go +type Node struct { + data float64 + su *Node +} +``` + +链表中的第一个元素叫`head`,它指向第二个元素;最后一个元素叫`tail`,它没有后继元素,所以它的su为nil值。当然真实的链接会有很多数据节点,并且链表可以动态增长或收缩。 + +同样地可以定义一个双向链表,它有一个前趋节点pr和一个后继节点su: + +```go +type Node struct { + pr *Node + data float64 + su *su +} +``` + +二叉树: + +![](images/10.1_fig10.4.jpg?raw=true) + +二叉树中每个节点最多能链接至两个节点:左节点(le)和右节点(ri),这两个节点本身又可以有左右节点,依次类推。树的顶层节点叫根节点(`root`),底层没有子节点的节点叫叶子节点(`leaves`),叶子节点的le和ri指针为空值。在Go中可以如下定义树: + +```go +type Tree strcut { + le *Tree + data float64 + ri *Tree +} +``` + +**结构体转换** + +Go中的类型转换遵循严格的规则。当为结构体定义了一个alias类型时,此结构体类型和它的alias类型都有相同的底层类型,它们可以如[Listing 10.3]那样互相转换,同时需要注意其中非法赋值或转换引起的编译错误: + +```go +package main +import "fmt" + +type number struct { + f float32 +} + +type nr number // alias type + +func main() { + a := number{5.0} + b := nr{5.0} + // var i float32 = b // compile-error: cannot use b (type nr) as type + float32 in assignment + // var i = float32(b) // compile-error: cannot convert b (type nr) to + type float32 + // var c number = b // compile-error: cannot use b (type nr) as type number in assignment + // needs a conversion: + var c = number(b) + fmt.Println(a, b, c) +} +``` + +输出: + + {5} {5} {5} + +**练习** + +*练习 10.1* + +vcard.go:定义结构体Address和VCard,后者包含一个人的名字、地址编号、出生日期和图像,试着选择正确的数据类型。构建一个自己的vcard并打印它的内容。 + +提示: + +VCard必须包含住址,它应该以值类型还是以指针类型放在VCard中呢? + +第二种会好点,因为它占用内存少。包含一个名字和两个指向地址的指针的Address结构体可以使用%v打印: + + {Kersschot 0x126d2b80 0x126d2be0} + +*练习 10.2* 修改*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()并测试 ## 链接 - [目录](directory.md) - 上一节:[10 结构(struct)与方法(method)](10.0.md) -- 下一节:[regexp 包](09.2.md) +- 下一节:[10.2 使用工厂方法创建结构体](10.2.md) diff --git a/eBook/images/10.1_fig10.3.jpg b/eBook/images/10.1_fig10.3.jpg new file mode 100644 index 0000000000000000000000000000000000000000..2c59db78e586dbdb4d22fa43917b3870668327b2 GIT binary patch literal 7519 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 dbT|9_