mirror of
https://github.com/unknwon/the-way-to-go_ZH_CN.git
synced 2025-08-12 05:33:04 +08:00
auto commit
This commit is contained in:
@@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
## 10.2.1 结构体工厂
|
## 10.2.1 结构体工厂
|
||||||
|
|
||||||
Go 语言不支持面向对象编程语言中那样的构造子方法,但是可以很容易的在 Go 中实现 “构造子工厂“ 方法。为了方便通常会为类型定义一个工厂,按惯例,工厂的名字以 new 或 New 开头。假设定义了如下的 File 结构体类型:
|
Go 语言不支持面向对象编程语言中那样的构造子方法,但是可以很容易的在 Go 中实现 “构造子工厂”方法。为了方便通常会为类型定义一个工厂,按惯例,工厂的名字以 new 或 New 开头。假设定义了如下的 File 结构体类型:
|
||||||
|
|
||||||
```go
|
```go
|
||||||
type File struct {
|
type File struct {
|
||||||
@@ -29,7 +29,7 @@ func NewFile(fd int, name string) *File {
|
|||||||
f := NewFile(10, "./test.txt")
|
f := NewFile(10, "./test.txt")
|
||||||
```
|
```
|
||||||
|
|
||||||
在 Go 语言中常常像上面这样在工厂方法里使用初始化来简便的实现构造子。
|
在 Go 语言中常常像上面这样在工厂方法里使用初始化来简便的实现构造函数。
|
||||||
|
|
||||||
如果 `File` 是一个结构体类型,那么表达式 `new(File)` 和 `&File{}` 是等价的。
|
如果 `File` 是一个结构体类型,那么表达式 `new(File)` 和 `&File{}` 是等价的。
|
||||||
|
|
||||||
@@ -41,7 +41,7 @@ f := NewFile(10, "./test.txt")
|
|||||||
|
|
||||||
**如何强制使用工厂方法**
|
**如何强制使用工厂方法**
|
||||||
|
|
||||||
通过应用可见性规则(参考第 4.2.1、9.5 节)就可以禁止使用 new 函数,强制用户使用工厂方法,从而使类型变成私有的,就像在面向对象语言中那样。
|
通过应用可见性规则参考[4.2.1节](04.2.md)、[9.5 节](09.5.md)就可以禁止使用 new 函数,强制用户使用工厂方法,从而使类型变成私有的,就像在面向对象语言中那样。
|
||||||
|
|
||||||
```go
|
```go
|
||||||
type matrix struct {
|
type matrix struct {
|
||||||
@@ -70,9 +70,9 @@ new 和 make 这两个内置函数已经在第 [7.2.4](07.2.md) 节通过切片
|
|||||||
|
|
||||||
现在为止我们已经见到了可以使用 `make()` 的三种类型中的其中两个:
|
现在为止我们已经见到了可以使用 `make()` 的三种类型中的其中两个:
|
||||||
|
|
||||||
slices / maps / channels(见第 14 章)
|
slices / maps / channels 参考[第14章](14.0.md)
|
||||||
|
|
||||||
下面的例子来说明了在映射上使用 new 和 make 的区别,以及可能的发生的错误:
|
下面的例子说明了在映射上使用 new 和 make 的区别以及可能发生的错误:
|
||||||
|
|
||||||
示例 10.4 new_make.go(不能编译)
|
示例 10.4 new_make.go(不能编译)
|
||||||
|
|
||||||
@@ -113,5 +113,5 @@ func main() {
|
|||||||
## 链接
|
## 链接
|
||||||
|
|
||||||
- [目录](directory.md)
|
- [目录](directory.md)
|
||||||
- 上一节:[结构体定义)](10.1.md)
|
- 上一节:[结构体定义](10.1.md)
|
||||||
- 下一节:[使用自定义包中的结构体](10.3.md)
|
- 下一节:[使用自定义包中的结构体](10.3.md)
|
||||||
|
Reference in New Issue
Block a user