返回

解读Go语言中make和new的区别,探索内存分配的奥秘

前端

在Go语言中,make和new都是内置函数,用于分配内存。但它们在使用方式和分配内存的机制上存在着一些关键区别。

1. make与new的语法

make

func make(t Type, size ...IntegerType) Type

new

func new(Type) *Type

2. make与new的返回值

make

make返回分配好内存的切片、通道、map。

new

new返回分配好内存的类型指针。

3. make与new的适用场景

make

  • 创建切片、通道、map。
  • 其中切片,如果不用make分配内存,而是用append在空切片上添加数据,append会先创建底层数组,再追加数据到数组中。
  • 通道,如果不用make分配内存,直接使用nil,通道为非阻塞,数据写入通道会失败。
  • map,如果不用make分配内存,直接使用nil,使用时map会先创建底层数组,再哈希存储数据。

new

  • 创建结构体、接口等类型的指针变量。
  • 使用new分配的内存变量必须使用*操作符取值才能正常使用。
  • 比如创建一个结构体:
type Student struct {
    Name string
    Age int
}
func main() {
    // 使用new分配内存
    s := new(Student)

    // 使用*取值
    s.Name = "John"
    s.Age = 20

    fmt.Println(s)
}

输出:

&{John 20}

4. make与new的性能

一般情况下,make的性能优于new。这是因为make在分配内存时会对内存进行初始化,而new不会。因此,make分配的内存可以立即使用,而new分配的内存需要先进行初始化才能使用。

5. make与new的总结

特性 make new
语法 func make(t Type, size ...IntegerType) Type func new(Type) *Type
返回值 分配好内存的切片、通道、map 分配好内存的类型指针
适用场景 创建切片、通道、map 创建结构体、接口等类型的指针变量
性能 优于new 劣于make
内存初始化 不会

总的来说,make和new都是Go语言中分配内存的内置函数,但它们在使用方式、返回值、适用场景、性能和内存初始化方面存在着一些关键区别。在实际开发中,您需要根据具体情况选择使用make还是new来分配内存。