golang make new 区别

发布时间:2024-07-07 16:34:23

在Go语言中,make和new是两个常用的关键字,用于在运行时动态地分配内存。虽然它们都能创建新的对象,但实际上它们有着不同的作用和使用场景。

1. make的作用和使用

make函数主要用于创建切片、映射和通道等引用类型的数据结构。它的基本语法是:

make(T, size)

其中T表示要创建的类型,size表示要为其分配的内存空间大小。对于切片和映射,我们只需要传递类型并且不需要指定大小,因为它们是引用类型,所以底层数据结构会自动分配所需的内存。

例如,我们可以使用make函数创建一个切片:

slice := make([]int, 10)

上述代码会创建一个长度为10的整型切片,并将其赋值给slice变量。这里的make函数会初始化切片的底层数组,并为其分配足够的内存空间。

2. new的作用和使用

与make不同,new关键字主要用于创建值类型的对象,如结构体。它的基本语法是:

new(T)

其中T表示要创建的类型。new函数会分配足够的内存空间,并返回一个指向该内存的指针。

举个例子,我们可以使用new关键字创建一个整型变量:

ptr := new(int)

上述代码会创建一个新的整型变量,并将其赋值给ptr变量。这里的new函数会分配4个字节的内存空间,用于存储整数类型的数据。

3. make和new的适用场景

make和new有着不同的适用场景。它们的选择主要取决于所创建对象的类型和需求。

3.1 创建引用类型对象

当我们需要创建切片、映射或通道等引用类型的对象时,应该使用make函数。这是因为这些对象底层使用了指针来管理数据,需要在内存中分配足够的空间来存储元素和相关信息。

例如,当我们需要创建一个动态大小的字符串数组时,应该使用make函数来创建切片。此时,make会在内存中分配连续的空间来存储字符串元素,并且可以根据需要动态地调整切片的大小。

3.2 创建值类型对象

当我们需要创建结构体或其他值类型对象时,应该使用new关键字。这是因为值类型的对象在内存中是分配在栈上的,不需要连续的内存块来存储数据。

例如,当我们需要创建一个新的整型变量时,可以使用new函数来动态地分配内存空间,然后通过指针来操作这个变量。

3.3 选择合适的方式

在某些情况下,我们可能需要同时创建引用类型和值类型对象。此时,我们可以根据具体需求选择合适的方式。

例如,如果我们需要创建一个包含初始值的整型切片,可以使用make函数创建切片并初始化其元素,然后通过索引赋值的方式修改其中的元素。

另外,我们还可以使用new关键字创建一个结构体对象,并且在之后通过指针访问其成员属性。

通过对比make和new的作用和使用方式,我们可以根据具体需求选择合适的关键字来创建对象。make适用于引用类型对象的创建,而new适用于值类型对象的创建。在实际开发中,我们应该根据对象类型、内存需求和操作方式等因素来决定使用make还是new。

相关推荐