mirror of
https://github.com/unknwon/the-way-to-go_ZH_CN.git
synced 2025-08-12 03:34:15 +08:00
@@ -35,7 +35,7 @@ t = new(T)
|
||||
|
||||
写这条语句的惯用方法是:`t := new(T)`,变量 `t` 是一个指向 `T`的指针,此时结构体字段的值是它们所属类型的零值。
|
||||
|
||||
声明 `var t T` 也会给 `t` 分配内存,并零值化内存,但是这个时候 `t` 是类型T。在这两种方式中,`t` 通常被称做类型 T 的一个实例(instance)或对象(Object)。
|
||||
声明 `var t T` 也会给 `t` 分配内存,并零值化内存,但是这个时候 `t` 是类型T。在这两种方式中,`t` 通常被称做类型 T 的一个实例(instance)或对象(object)。
|
||||
|
||||
示例 10.1 [structs_fields.go](examples/chapter_10/structs_fields.go) 给出了一个非常简单的例子:
|
||||
|
||||
@@ -85,7 +85,7 @@ v.i
|
||||
p.i
|
||||
```
|
||||
|
||||
初始化一个结构体实例(一个结构体字面量:struct-literal)的更简短和惯用的方式如下:
|
||||
初始化一个结构体实例(一个结构体字面量:struct-literal)的更简短和惯用的方式如下:
|
||||
|
||||
```go
|
||||
ms := &struct1{10, 15.5, "Chris"}
|
||||
@@ -120,7 +120,7 @@ intr := Interval{end:5} (C)
|
||||
|
||||
在(A)中,值必须以字段在结构体定义时的顺序给出,**&** 不是必须的。(B)显示了另一种方式,字段名加一个冒号放在值的前面,这种情况下值的顺序不必一致,并且某些字段还可以被忽略掉,就像(C)中那样。
|
||||
|
||||
结构体类型和字段的命名遵循可见性规则(第 [4.2](04.2.md) 节),一个导出的结构体类型中有些字段是导出的,另一些不是,这是可能的。
|
||||
结构体类型和字段的命名遵循可见性规则(第 [4.2](04.2.md) 节),一个导出的结构体类型中有些字段是导出的,另一些不是,这是可能的。
|
||||
|
||||
下图说明了结构体类型实例和一个指向它的指针的内存布局:
|
||||
|
||||
@@ -138,7 +138,7 @@ type Point struct { x, y int }
|
||||
|
||||
类型 strcut1 在定义它的包 pack1 中必须是唯一的,它的完全类型名是:`pack1.struct1`。
|
||||
|
||||
下面的例子 [Listing 10.2—person.go](examples/person.go) 显示了一个结构体 Person,一个方法,方法有一个类型为 `*Person` 的参数(因此对象本身是可以被改变的),以及三种调用这个方法的不同方式:
|
||||
下面的例子 [Listing 10.2—person.go](examples/chapter_10/person.go) 显示了一个结构体 Person,一个方法,方法有一个类型为 `*Person` 的参数(因此对象本身是可以被改变的),以及三种调用这个方法的不同方式:
|
||||
|
||||
```go
|
||||
package main
|
||||
|
@@ -2,7 +2,7 @@
|
||||
|
||||
## 10.2.1 结构体工厂
|
||||
|
||||
Go 语言不支持面向对象编程语言中那样的构造子方法,但是可以很容易的在 Go 中实现 “构造子工厂“ 方法。为了方便通常会为类型定义一个工厂,按惯例,工厂的名字以 new 或 New 开头。假设定义了如下的 File 结构体类型:
|
||||
Go 语言不支持面向对象编程语言中那样的构造子方法,但是可以很容易的在 Go 中实现 “构造子工厂”方法。为了方便通常会为类型定义一个工厂,按惯例,工厂的名字以 new 或 New 开头。假设定义了如下的 File 结构体类型:
|
||||
|
||||
```go
|
||||
type File struct {
|
||||
@@ -29,7 +29,7 @@ func NewFile(fd int, name string) *File {
|
||||
f := NewFile(10, "./test.txt")
|
||||
```
|
||||
|
||||
在 Go 语言中常常像上面这样在工厂方法里使用初始化来简便的实现构造子。
|
||||
在 Go 语言中常常像上面这样在工厂方法里使用初始化来简便的实现构造函数。
|
||||
|
||||
如果 `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
|
||||
type matrix struct {
|
||||
@@ -72,7 +72,7 @@ new 和 make 这两个内置函数已经在第 [7.2.4](07.2.md) 节通过切片
|
||||
|
||||
slices / maps / channels(见第 14 章)
|
||||
|
||||
下面的例子来说明了在映射上使用 new 和 make 的区别,以及可能的发生的错误:
|
||||
下面的例子说明了在映射上使用 new 和 make 的区别以及可能发生的错误:
|
||||
|
||||
示例 10.4 new_make.go(不能编译)
|
||||
|
||||
@@ -113,5 +113,5 @@ func main() {
|
||||
## 链接
|
||||
|
||||
- [目录](directory.md)
|
||||
- 上一节:[结构体定义)](10.1.md)
|
||||
- 上一节:[结构体定义](10.1.md)
|
||||
- 下一节:[使用自定义包中的结构体](10.3.md)
|
||||
|
Reference in New Issue
Block a user