ch10.2完成

This commit is contained in:
leisore
2015-07-04 15:31:19 +08:00
parent 4595a991b2
commit 1fa82a86c7
2 changed files with 83 additions and 4 deletions

View File

@@ -11,7 +11,7 @@ type File struct {
}
```
下面是这个结构体类型对应的工厂函数,它返回一个指向结构体实例的指针:
下面是这个结构体类型对应的工厂方法,它返回一个指向结构体实例的指针:
```go
func NewFile(fd int, name string) *File {
@@ -22,12 +22,90 @@ func NewFile(fd int, name string) *File {
return &File(id, name)
}
```
调用它的例子:`f := NewFile(10, "./test.txt")`
**练习**
在Go语言中常常像上面这样在工厂方法里使用初始化简便的实现构造子。
*练习 10.1*
如果`File`是一个结构体类型,那么表达式`new(File)``&File{}`是等价的。
可以和大多数面向对象编程语言中笨拙的初始化方式做个比较:`File f = new File(...)`
我们可以说是工厂实例化了类型的一个对象就像在基于类的OO语言中那样。
如果想知道结构体类型T的一个实例占用了多少内存可以使用`size := unsafe.Sizeof(T{})`
*如果强制使用工程函数*
通过使用可见性规则参考4.2.19.5就可以禁止使用new函数强制用户使用工厂方法从而有效地使类型变成私有的就像在OO语言中那样。
```go
type matrix struct {
...
}
func NewMatrix(params) *matrix {
m := new(matrix) // 处初始化m
return m
}
```
在其他包里使用工厂方法:
```go
package main
import "matrix"
...
wrong := new(matrix.matrix) // 编译失败matrix是私有的
right := matrix.NewMatrix(...) // 实例化matrix的唯一方式
```
## 10.2.2 map和struct vs new()和make()再探
new和make这两个内置函数已经在[7.2.4](7.2.md)节通过切片的例子说明过一次。
现在为止我们已经见到了可以使用make()的三种类型其中的两个:
slices / maps / channels见第14章
使用下面的例子来说明下在映射上使用它们的区别和可能的发生的错误:
Listing 10.4—new_make.go不能编译
```go
package main
type Foo map[string]string
type Bar struct {
thingOne string
thingTwo int
}
func main() {
// OK
y := new(Bar)
(*y).thingOne = "hello"
(*y).thingTwo = 1
// NOT OK
z := make(Bar) // 编译错误cannot make type Bar
(*y).thingOne = "hello"
(*y).thingTwo = 1
// OK
x := make(Foo)
x["x"] = "goodbye"
x["y"] = "world"
// NOT OK
u := new(Foo)
(*u)["x"] = "goodbye" // 运行时错误!! panic: assignment to entry in nil map
(*u)["y"] = "world"
}
```
试图make()一个结构体变量会引发一个编译错误这不是太糟糕但是new()一个映射并试图使用数据填充它将会引发运行时错误new(Foo)会返回一个指向nil的指针它尚未被分配内存。所以在使用map时要特别谨慎。
## 链接
- [目录](directory.md)
- 上一节:[10 结构struct与方法method](10.0.md)
- 下一节:[10.2 使用工厂方法创建结构体实例](10.2.md)
- 下一节:[10.3 使用结构体定制包](10.3.md)

View File

@@ -86,6 +86,7 @@
- 9.11 [在 Go 程序中使用外部库](09.11.md)
- 第10章[结构struct与方法method](10.0.md)
- 10.1 [结构体定义](10.1.md)
- 10.2 [使用工厂方法创建结构体实例](10.2.md)
- 第11章接口interface与反射reflection
## 第三部分Go 高级编程