当面试官问:Golang中make和new的区别及内存管理

322 阅读3分钟

在Golang中,make和new是两个常用的函数,用于创建变量和管理内存。虽然它们都能创建变量,但是它们的用途和实现方式有所不同。在本篇博客中,我们将深入介绍make和new的概念和用法,以及Golang的内存管理原理。

1. make和new的概念和用法

make和new都是用于创建变量的函数,但是它们的用途和实现方式有所不同。

make函数用于创建slice、map和channel等引用类型的变量,它的语法如下:

make(Type, size)

其中,Type表示变量的类型,size表示变量的长度或容量,具体取决于变量的类型。例如,创建一个长度为10的int类型的slice变量,可以使用以下代码:

s := make([]int, 10)

new函数用于创建值类型的指针,它的语法如下:

new(Type)

其中,Type表示变量的类型。例如,创建一个int类型的指针变量,可以使用以下代码:

p := new(int)

需要注意的是,new返回的是指向变量的指针,而不是变量本身。

2. make和new的区别

make和new的区别主要有以下几点:

  1. 返回类型不同:make返回引用类型,new返回指针类型。

  2. 参数不同:make需要指定类型和长度(或容量),new只需要指定类型。

  3. 初始化不同:make返回的变量已经被初始化,new返回的变量需要手动初始化。

3. Golang的内存管理原理

在Golang中,内存被分为堆和栈两部分。堆用于存储动态分配的内存,栈用于存储函数调用时的局部变量和函数参数等数据。

Golang的垃圾回收机制是基于标记-清除算法实现的。当一个变量不再被引用时,垃圾回收器会自动将其标记为垃圾,并在适当的时候将其回收。

内存逃逸分析是Golang的一项重要功能,它可以在编译时分析代码,确定变量是否逃逸到堆上,从而减少内存分配和垃圾回收的开销。

4. make和new的内存管理实现原理

make和new在内存管理方面的实现方式有所不同。

当使用make创建引用类型的变量时,Golang会在堆上分配内存,并返回该变量的引用。例如,创建一个长度为10的int类型的slice变量,Golang会在堆上分配一个大小为40字节的内存块,并返回该内存块的引用。

当使用new创建值类型的指针时,Golang会在堆上分配内存,并返回该内存的地址。例如,创建一个int类型的指针变量,Golang会在堆上分配一个大小为8字节的内存块,并返回该内存块的地址。

需要注意的是,make创建的变量已经被初始化,而new创建的变量需要手动初始化。这是因为make创建的变量是引用类型,其底层数据结构已经被初始化,而new创建的变量是值类型的指针,其指向的值需要手动初始化。

5. 总结

通过本篇博客,我们深入介绍了make和new的概念和用法,以及Golang的内存管理原理和实现方式。make和new的区别和使用场景、Golang的内存管理原理和实现方式都是Golang开发者必须掌握的知识点,希望本篇博客对读者有所帮助。