使用工厂方法创建结构体实例
10.2.1 结构体工厂
Go 语言不支持面向对象编程语言中那样的构造子方法,但是可以很容易的在 Go 中实现 “构造子工厂”方法。为了方便通常会为类型定义一个工厂,按惯例,工厂的名字以 new...
或 New...
开头。假设定义了如下的 File
结构体类型:
下面是这个结构体类型对应的工厂方法,它返回一个指向结构体实例的指针:
然后这样调用它:
在 Go 语言中常常像上面这样在工厂方法里使用初始化来简便的实现构造函数。
如果 File
是一个结构体类型,那么表达式 new(File)
和 &File{}
是等价的。
这可以和大多数面向对象编程语言中笨拙的初始化方式做个比较:File f = new File(...)
。
我们可以说是工厂实例化了类型的一个对象,就像在基于类的 OO 语言中那样。
如果想知道结构体类型 T
的一个实例占用了多少内存,可以使用:size := unsafe.Sizeof(T{})
。
如何强制使用工厂方法
在其他包里使用工厂方法:
10.2.2 map 和 struct vs new() 和 make()
现在为止我们已经见到了可以使用 make()
的三种类型中的其中两个:
下面的例子说明了在映射上使用 new()
和 make()
的区别以及可能发生的错误:
试图 make()
一个结构体变量,会引发一个编译错误,这还不是太糟糕,但是 new()
一个 map
并试图向其填充数据,将会引发运行时错误! 因为 new(Foo)
返回的是一个指向 nil
的指针,它尚未被分配内存。所以在使用 map
时要特别谨慎。
链接
Last updated
Was this helpful?