8.5. 构造值对象

Go有一个内建的new函数,用于在堆上为任意类型变量分配一个空间。新分配的 内存会内自动初始化为0。 例如,new(int) 会在堆上分配一个整型大小的空间, 然后初始化为0,然后返回 *int 类型的地址。 和C++中不同的 是,new是一个函数而不是运算符,因此 new int 用法是错误的。

对于字典和管道,必须用内建的make函数分配空间。对于没有初始化的字典或 管道变量,会被自动初始化为nil。 调用make(mapint?int) 返回一个新的字典空间,类型为mapint?int。需要强调的是,make 返回的是值, 而不是指针!与此对应的是,字典和管道是通过引用传递的。对于make 分配字典空间,还可以有一个可选的函数, 用于指定字典的容量。如果是用于创建管道,则可选的参数 对应管道的缓冲大小,默认0表示不缓存。

make函数还可以用于创建切片。这时,会在堆中分配一个不可见的数组,然后返回 对这个数组引用的切片。 对于切片,make函数除了一个指定切片大小的参数外, 还有一个可选的用于指定切片容量的参数(最多有3个参数)。 例如,make(int, 10, 20), 用于创建一个大小是10,容量是20的切片。当然,用new函数也能实现: new(20?int)0:10?。go支持垃圾内存自动回收,因此新分配的内存空间没有 任何切片引用的时候,可能会被自动释放。