10.2 使用工厂方法创建结构体实例

    下面是这个结构体类型对应的工厂方法,它返回一个指向结构体实例的指针:

    1. if fd < 0 {
    2. return nil
    3. return &File{fd, name}
    4. }

    然后这样调用它:

    在 Go 语言中常常像上面这样在工厂方法里使用初始化来简便的实现构造函数。

    如果 File 是一个结构体类型,那么表达式 new(File) 和 是等价的。

    我们可以说是工厂实例化了类型的一个对象,就像在基于类的OO语言中那样。

    如果想知道结构体类型T的一个实例占用了多少内存,可以使用:size := unsafe.Sizeof(T{})

    如何强制使用工厂方法

    通过应用可见性规则参考、9.5 节就可以禁止使用 new 函数,强制用户使用工厂方法,从而使类型变成私有的,就像在面向对象语言中那样。

    1. type matrix struct {
    2. ...
    3. }
    4. func NewMatrix(params) *matrix {
    5. m := new(matrix) // 初始化 m
    6. }

    new 和 make 这两个内置函数已经在第 节通过切片的例子说明过一次。

    现在为止我们已经见到了可以使用 make() 的三种类型中的其中两个:

    1. slices / maps / channels(见第 14 章)

    下面的例子说明了在映射上使用 new 和 make 的区别以及可能发生的错误:

    示例 10.4 new_make.go(不能编译)