Merge pull request #159 from dake/master

阅读第十章, 并作少量校对修正
This commit is contained in:
无闻
2015-10-24 13:03:11 -04:00
4 changed files with 12 additions and 12 deletions

View File

@@ -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()

View File

@@ -2,7 +2,7 @@
## 10.5.1 定义
结构体可以包含一个或多个 **匿名(或内嵌)字段**,即这些字段没有显式的名字,只有字段的类型是必须的,此时类型就是字段的名字。匿名字段本身可以是一个结构体类型,即 **结构体可以包含内嵌结构体**
结构体可以包含一个或多个 **匿名(或内嵌)字段**,即这些字段没有显式的名字,只有字段的类型是必须的,此时类型就是字段的名字。匿名字段本身可以是一个结构体类型,即 **结构体可以包含内嵌结构体**
可以粗略地将这个和面向对象语言中的继承概念相比较随后将会看到它被用来模拟类似继承的行为。Go 语言中的继承是通过内嵌或组合来实现的,所以可以说,在 Go 语言中,相比较于继承,组合更受青睐。
@@ -100,7 +100,7 @@ func main() {
当两个字段拥有相同的名字(可能是继承来的名字)时该怎么办呢?
1. 外层名字会覆盖内层名字,这提供了一种重载字段或方法的方式
1. 外层名字会覆盖内层名字(但是两者的内存空间都保留),这提供了一种重载字段或方法的方式
2. 如果相同的名字在同一级别出现了两次,如果这个名字被程序使用了,将会引发一个错误(不使用没关系)。没有办法来解决这种问题引起的二义性,必须由程序员自己修正。
例子:

View File

@@ -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 的接口提供了更强大、却更简单的多态行为。

View File

@@ -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