文章

Go new 和 make 的区别

在 Go 语言中,newmake 都用于分配内存,但它们的用途和行为有所不同。

new

  • 用途new 用于为值类型(如结构体、整数、数组等)分配内存,并返回指向该类型的指针。

  • 行为new(T) 会分配一个类型为 T 的零值内存,并返回其指针(即 *T)。

示例

p := new(int)  // p 是一个 *int 类型的指针,指向一个零值的 int
fmt.Println(*p) // 输出 0

make

  • 用途make 用于为引用类型(如切片、映射、通道)分配内存并初始化。

  • 行为make 不仅分配内存,还会初始化数据结构(如设置切片的长度和容量、初始化映射等)。

示例

s := make([]int, 10)  // 创建一个长度为 10 的切片
m := make(map[string]int)  // 创建一个空的映射
ch := make(chan int)  // 创建一个无缓冲的通道

主要区别

  1. 适用类型

    • new 适用于值类型。

    • make 适用于引用类型(切片、映射、通道)。

  2. 返回值

    • new 返回指针。

    • make 返回初始化后的引用类型。

  3. 初始化

    • new 只分配内存并返回零值的指针。

    • make 分配内存并初始化数据结构。

总结

  • 使用 new 来分配值类型的内存并获取指针。

  • 使用 make 来分配并初始化引用类型的内存。

License:  CC BY 4.0