golang中new和make的区别

发布时间:2024-07-07 16:17:47

在Golang中,我们经常会用到new和make这两个关键字来分配内存。虽然它们的作用看起来很相似,但实际上它们有着不同的使用方式和适用范围。在本文中,我们将详细阐述new和make的区别。

new关键字的使用

new是一个用于创建类型实例的内建函数。它返回一个指向已分配内存的指针,其中这片内存被初始化为零值。使用new关键字,我们可以创建各种基本类型、自定义类型、指针等。

new关键字的语法如下:

ptr := new(Type)

其中,Type表示要创建的类型。new函数将根据类型的大小分配足够的内存,并返回一个指向该内存的指针。由于返回的是一个指针,因此我们可以使用箭头符号来访问其属性或方法。

下面是一个使用new关键字的示例:

type Person struct {
    Name string
    Age  int
}

func main() {
    p := new(Person)
    p.Name = "Alice"
    p.Age = 25
    fmt.Println(p)
}

在上述示例中,我们使用new关键字创建了一个Person类型的实例,并设置了其Name和Age属性的值。最后,我们通过打印实例来验证它是否成功创建。

make关键字的使用

make是一个用于创建切片、映射和通道的内建函数。与new关键字不同,make函数返回的是一个已经初始化后的(非零值)引用。

make关键字的语法如下:

slice := make([]Type, length, capacity)
map := make(map[KeyType]ValueType)
channel := make(chan Type)

在上述语法中:

下面是一些使用make关键字的示例:

使用make创建切片:

slice := make([]int, 5, 10)

在上述示例中,我们使用make函数创建了一个包含5个整数的切片,其容量为10。由于使用了make关键字,切片将被初始化为非零值,即默认情况下,其元素会被赋予类型的零值。

使用make创建映射:

m := make(map[string]int)

在上述示例中,我们使用make函数创建了一个字符串到整数的映射。与切片类似,由于使用了make关键字,映射将被初始化为非零值。此时,我们可以直接对映射进行操作,而不需要再次分配内存。

使用make创建通道:

c := make(chan int)

在上述示例中,我们使用make函数创建了一个整数型的通道。同样地,由于使用了make关键字,通道将被初始化为非零值。我们可以通过通道进行并发操作,向其中发送和接收数据。

综上所述,new关键字用于创建各种类型的实例,并返回一个指向已分配内存的指针。而make关键字则专门用于创建切片、映射和通道,并返回一个已经初始化后的(非零值)引用。虽然new和make在某些情况下可以互换使用,但我们应该根据具体需要选择合适的关键字,以确保代码的正确性和性能优化。

相关推荐