视频字幕
在Go语言中,make和new是两个重要的内置函数,用于创建和初始化对象。虽然它们都能创建对象,但用途和机制完全不同。make主要用于创建slice、map和channel等引用类型,而new则用于分配内存并返回指向零值的指针。理解它们的区别对于编写高效的Go代码至关重要。
make函数专门用于创建三种引用类型:slice、map和channel。与new不同,make不仅分配内存,还会对这些数据结构进行必要的初始化。比如创建slice时,make会设置长度和容量;创建map时,会初始化哈希表结构;创建channel时,会设置缓冲区。这些类型需要特殊的初始化过程,所以必须使用make而不是new。
new函数的工作原理相对简单直接。当调用new(T)时,它会为类型T分配足够的内存空间,然后将这块内存初始化为该类型的零值,最后返回指向这块内存的指针。new适用于所有Go类型,包括基本类型、结构体、数组等。但是new只负责内存分配和零值初始化,不会进行任何复杂的数据结构初始化工作。
从底层实现来看,make和new有着根本性的差异。make函数会创建复杂的数据结构,包含元数据信息如长度、容量、以及指向实际数据的指针,还会初始化必要的内部结构如哈希表。而new函数的实现则相对简单,它只是分配一块内存,将其初始化为零值,然后返回指向这块内存的指针。这种差异决定了它们适用的场景完全不同。
选择make还是new的原则很简单:如果要创建slice、map或channel这三种引用类型,必须使用make,因为它们需要特殊的初始化。对于其他所有类型,包括基本类型、结构体、数组等,可以使用new。但在实际开发中,我们通常优先使用字面量语法,因为它更简洁直观。记住这个原则:引用类型用make,值类型用new或字面量,优先选择字面量语法。