golang中make和new的区别

发布时间:2024-07-02 21:35:45

在golang中,我们经常会使用make和new来创建变量。尽管它们都用于动态分配内存,但它们在功能和使用方式上有一些区别。本文将深入讨论make和new的不同之处。

make:

在golang中,make函数用于创建slice、map和channel类型的变量。使用make创建的对象是引用类型,并且返回的是对象本身而不是指针。make函数的语法如下:

make(T, size)

T表示要创建的对象的类型(slice、map或channel),size表示初始化时的长度(仅适用于slice和map)。

使用make创建对象时,会自动分配初始值并返回对应的引用类型变量。对于slice和map,make函数会分配足够的内存以容纳初始长度。对于channel,make函数会创建一个带有指定缓冲区大小的channel对象。

new:

与make函数不同,new函数用于创建所有类型的变量,包括基本数据类型。使用new创建的对象是指针类型,并返回指向新分配的零值对象的指针。new函数的语法如下:

new(T)

T表示要创建的对象的类型(可以是基本数据类型或任何结构体类型)。new函数会分配足够的内存来存储对象,并将指针返回给调用者。新分配的对象将以零值初始化。

与变量声明的区别:

下面的代码片段演示了使用make和new创建变量的区别:

package main

import "fmt"

func main() {
    // 使用make创建slice
    s := make([]int, 5)
    fmt.Println(s) // 输出: [0 0 0 0 0]

    // 使用new创建结构体
    var p *Person = new(Person)
    fmt.Println(p) // 输出: &{"" 0}
}

type Person struct {
    Name string
    Age  int
}

从上面的代码中可以清楚地看出,使用make创建的slice变量已经被初始化为默认值,而使用new创建的Person结构体变量则没有被初始化,只包含了初始值为零的字段。

总结:

通过上面的讨论,我们可以得出以下结论:

因此,在选择make或new函数时,需要根据需求和变量类型来确定使用哪个函数。如果需要创建slice、map或channel类型的变量,并且希望它们被初始化为默认值,则应该使用make函数。如果只是想要分配内存并获得指向新分配的零值对象的指针,则应该使用new函数。

相关推荐