From 6bdfd35819432bdc01ce885159467028f3e49e73 Mon Sep 17 00:00:00 2001 From: dake Date: Fri, 23 Oct 2015 18:15:08 +0800 Subject: [PATCH 1/4] =?UTF-8?q?=E6=A0=A1=E5=AF=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- eBook/10.2.md | 10 +++++----- eBook/10.5.md | 4 ++-- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/eBook/10.2.md b/eBook/10.2.md index 9b2d486..14047fa 100644 --- a/eBook/10.2.md +++ b/eBook/10.2.md @@ -57,11 +57,11 @@ func NewMatrix(params) *matrix { 在其他包里使用工厂方法: ```go - package main - import "matrix" - ... - wrong := new(matrix.matrix) // 编译失败(matrix 是私有的) - right := matrix.NewMatrix(...) // 实例化 matrix 的唯一方式 +package main +import "matrix" +... +wrong := new(matrix.matrix) // 编译失败(matrix 是私有的) +right := matrix.NewMatrix(...) // 实例化 matrix 的唯一方式 ``` ## 10.2.2 map 和 struct vs new() 和 make() diff --git a/eBook/10.5.md b/eBook/10.5.md index 061350a..b6515cd 100644 --- a/eBook/10.5.md +++ b/eBook/10.5.md @@ -2,7 +2,7 @@ ## 10.5.1 定义 -结构体可以包含一个或多个 **匿名(或内嵌)字段**,即这些字段没有显式的名字,只有字段的类型是必须的,此时类型也就是字段的名字。匿名字段本身可以是一个结构体类型,即 **结构体可以包含内嵌结构体**。 +结构体可以包含一个或多个 **匿名(或内嵌)字段**,即这些字段没有显式的名字,只有字段的类型是必须的,此时类型就是字段的名字。匿名字段本身可以是一个结构体类型,即 **结构体可以包含内嵌结构体**。 可以粗略地将这个和面向对象语言中的继承概念相比较,随后将会看到它被用来模拟类似继承的行为。Go 语言中的继承是通过内嵌或组合来实现的,所以可以说,在 Go 语言中,相比较于继承,组合更受青睐。 @@ -100,7 +100,7 @@ func main() { 当两个字段拥有相同的名字(可能是继承来的名字)时该怎么办呢? -1. 外层名字会覆盖内层名字,这提供了一种重载字段或方法的方式 +1. 外层名字会覆盖内层名字(但是两者的内存空间都保留),这提供了一种重载字段或方法的方式 2. 如果相同的名字在同一级别出现了两次,如果这个名字被程序使用了,将会引发一个错误(不使用没关系)。没有办法来解决这种问题引起的二义性,必须由程序员自己修正。 例子: From 27f5f76a813ac4bc387fa130659c9c650c0a88f7 Mon Sep 17 00:00:00 2001 From: dake Date: Sun, 25 Oct 2015 00:22:39 +0800 Subject: [PATCH 2/4] =?UTF-8?q?=E9=98=85=E8=AF=BB=E7=AC=AC=E5=8D=81?= =?UTF-8?q?=E7=AB=A0,=20=E5=B9=B6=E4=BD=9C=E5=B0=91=E9=87=8F=E6=A0=A1?= =?UTF-8?q?=E5=AF=B9=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- eBook/10.6.md | 6 +++--- eBook/10.7.md | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/eBook/10.6.md b/eBook/10.6.md index aefb924..a560d64 100644 --- a/eBook/10.6.md +++ b/eBook/10.6.md @@ -141,7 +141,7 @@ func (t time.Time) first3Chars() string { 类型在在其他的,或是非本地的包里定义,在它上面定义方法都会得到和上面同样的错误。 -但是有一个绕点的方式:可以先定义该类型(比如:int 或 float)的别名类型,然后再为别名类型定义方法。或者像下面这样将它作为匿名类型嵌入在一个新的结构体中。当然方法只在这个别名类型上有效。 +但是有一个间接的方式:可以先定义该类型(比如:int 或 float)的别名类型,然后再为别名类型定义方法。或者像下面这样将它作为匿名类型嵌入在一个新的结构体中。当然方法只在这个别名类型上有效。 示例 10.12 method_on_time.go: @@ -235,7 +235,7 @@ func main() { 试着在 `write()` 中改变接收者b的值:将会看到它可以正常编译,但是开始的 b 没有被改变。 -我们知道方法不需要指针作为接收者,如下面的例子,我们只是需要 `Point3` 的值来做计算: +我们知道方法将指针作为接收者不是必须的,如下面的例子,我们只是需要 `Point3` 的值来做计算: ```go type Point3 struct { x, y, z float } @@ -658,7 +658,7 @@ func (i *Integer) String() string { 在 Go 中,类型就是类(数据和关联的方法)。Go 不知道类似面向对象语言的类继承的概念。继承有两个好处:代码复用和多态。 -在 Go 中,代码复用通过组合和委托实现,多态通过接口的使用来实现:有时这也叫 **组件编程**。 +在 Go 中,代码复用通过组合和委托实现,多态通过接口的使用来实现:有时这也叫 **组件编程(component programming)**。 许多开发者说相比于类继承,Go 的接口提供了更强大、却更简单的多态行为。 diff --git a/eBook/10.7.md b/eBook/10.7.md index 5a02cae..0482285 100644 --- a/eBook/10.7.md +++ b/eBook/10.7.md @@ -45,7 +45,7 @@ func (tn *TwoInts) String() string { **备注** -不要在 `String()` 方法里面调用涉及 `String()` 方法的方法,它会导致意料之外的错误,比如下面的例子,它导致了一个无限迭代调用(`TT.String()` 调用 `fmt.Sprintf`,而 `fmt.Sprintf` 又会反过来调用 `TT.String()`...),很快就会导致内存溢出: +不要在 `String()` 方法里面调用涉及 `String()` 方法的方法,它会导致意料之外的错误,比如下面的例子,它导致了一个无限迭代(递归)调用(`TT.String()` 调用 `fmt.Sprintf`,而 `fmt.Sprintf` 又会反过来调用 `TT.String()`...),很快就会导致内存溢出: ```go type TT float64 From 52cac078fbc11bbe06eca2d605897eae64f915a0 Mon Sep 17 00:00:00 2001 From: dake Date: Sun, 25 Oct 2015 00:58:45 +0800 Subject: [PATCH 3/4] =?UTF-8?q?=E4=BF=AE=E6=AD=A3=E8=8B=B1=E6=96=87?= =?UTF-8?q?=E6=8B=AC=E5=8F=B7=20-->=20=E4=B8=AD=E6=96=87=E5=85=A8=E8=A7=92?= =?UTF-8?q?=E6=8B=AC=E5=8F=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- eBook/10.5.md | 2 +- eBook/10.6.md | 2 +- eBook/10.7.md | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/eBook/10.5.md b/eBook/10.5.md index b6515cd..27032d0 100644 --- a/eBook/10.5.md +++ b/eBook/10.5.md @@ -100,7 +100,7 @@ func main() { 当两个字段拥有相同的名字(可能是继承来的名字)时该怎么办呢? -1. 外层名字会覆盖内层名字(但是两者的内存空间都保留),这提供了一种重载字段或方法的方式 +1. 外层名字会覆盖内层名字(但是两者的内存空间都保留),这提供了一种重载字段或方法的方式 2. 如果相同的名字在同一级别出现了两次,如果这个名字被程序使用了,将会引发一个错误(不使用没关系)。没有办法来解决这种问题引起的二义性,必须由程序员自己修正。 例子: diff --git a/eBook/10.6.md b/eBook/10.6.md index a560d64..ff4c9f6 100644 --- a/eBook/10.6.md +++ b/eBook/10.6.md @@ -658,7 +658,7 @@ func (i *Integer) String() string { 在 Go 中,类型就是类(数据和关联的方法)。Go 不知道类似面向对象语言的类继承的概念。继承有两个好处:代码复用和多态。 -在 Go 中,代码复用通过组合和委托实现,多态通过接口的使用来实现:有时这也叫 **组件编程(component programming)**。 +在 Go 中,代码复用通过组合和委托实现,多态通过接口的使用来实现:有时这也叫 **组件编程(component programming)**。 许多开发者说相比于类继承,Go 的接口提供了更强大、却更简单的多态行为。 diff --git a/eBook/10.7.md b/eBook/10.7.md index 0482285..57bf14c 100644 --- a/eBook/10.7.md +++ b/eBook/10.7.md @@ -37,7 +37,7 @@ func (tn *TwoInts) String() string { 输出: two1 is: (12/10) - two1 is: (12/10) + two1 is: (12/10) two1 is: *main.TwoInts two1 is: &main.TwoInts{a:12, b:10} @@ -45,7 +45,7 @@ func (tn *TwoInts) String() string { **备注** -不要在 `String()` 方法里面调用涉及 `String()` 方法的方法,它会导致意料之外的错误,比如下面的例子,它导致了一个无限迭代(递归)调用(`TT.String()` 调用 `fmt.Sprintf`,而 `fmt.Sprintf` 又会反过来调用 `TT.String()`...),很快就会导致内存溢出: +不要在 `String()` 方法里面调用涉及 `String()` 方法的方法,它会导致意料之外的错误,比如下面的例子,它导致了一个无限迭代(递归)调用(`TT.String()` 调用 `fmt.Sprintf`,而 `fmt.Sprintf` 又会反过来调用 `TT.String()`...),很快就会导致内存溢出: ```go type TT float64 From c7a96ec5a8b3c1fbcda4dc7631a8dfc06c3751fb Mon Sep 17 00:00:00 2001 From: dake Date: Sun, 25 Oct 2015 01:00:00 +0800 Subject: [PATCH 4/4] mend --- eBook/10.6.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/eBook/10.6.md b/eBook/10.6.md index ff4c9f6..18f300e 100644 --- a/eBook/10.6.md +++ b/eBook/10.6.md @@ -658,7 +658,7 @@ func (i *Integer) String() string { 在 Go 中,类型就是类(数据和关联的方法)。Go 不知道类似面向对象语言的类继承的概念。继承有两个好处:代码复用和多态。 -在 Go 中,代码复用通过组合和委托实现,多态通过接口的使用来实现:有时这也叫 **组件编程(component programming)**。 +在 Go 中,代码复用通过组合和委托实现,多态通过接口的使用来实现:有时这也叫 **组件编程(Component Programming)**。 许多开发者说相比于类继承,Go 的接口提供了更强大、却更简单的多态行为。