Go中make和new的区别

宅哥聊构架 后端 2025-03-05

Go中make和new的区别

在 Go 语言中,makenew都用于分配内存,但它们有以下区别:

一、功能不同

  • make用于初始化切片(slice)、映射(map)和通道(channel)这三种特定的数据结构,并返回一个初始化后的对象。它不仅分配内存,还会对这些数据结构进行内部的初始化操作,使其处于可用状态。

  • new用于分配内存并返回一个指向新分配类型零值的指针。它可以用于任何类型,但主要用于值类型(如结构体)和基本数据类型的内存分配。

二、返回值类型不同

  • make返回的是初始化后的特定数据结构本身,而不是指针。例如,make([]int, 5)返回一个长度为 5 的切片,而不是指向切片的指针。

  • new返回的是指向新分配类型零值的指针。例如,new(int)返回一个指向整数类型零值的指针。

三、适用场景不同

  • make适用于切片、映射和通道的初始化,因为这些数据结构需要特定的内部初始化操作才能正常使用。例如,如果你要创建一个切片来存储一系列整数,使用make([]int, length, capacity)可以确保切片有正确的长度和容量,并初始化为整数类型的零值。

  • new适用于需要分配内存并返回一个指向新分配对象的指针的场景。例如,当你要创建一个结构体实例并在多个地方传递其指针时,可以使用new(StructType)来分配内存并获得一个指向新结构体的指针。

四、初始化程度不同

  • make会对特定的数据结构进行完整的初始化,包括设置长度、容量(对于切片和通道)、内部的哈希表(对于映射)等,使其可以立即使用。

  • new仅仅分配内存并将对象初始化为对应类型的零值。对于结构体等复合类型,其内部的字段可能还需要进一步的初始化才能正常使用。

例如:go

代码解读
复制代码
package main import "fmt" type Person struct { Name string Age int } func main() { // 使用 make 创建一个切片 s := make([]int, 5) fmt.Println(s) // 使用 make 创建一个映射 m := make(map[string]int) fmt.Println(m) // 使用 make 创建一个通道 c := make(chan int) fmt.Println(c) // 使用 new 创建一个结构体指针 p := new(Person) fmt.Println(p) }

转载来源:https://juejin.cn/post/7424338056919416858

Apipost 私有化火热进行中

评论