Go基础面试题, Go 语言的 make 和 new 有什么区别?
Go基础面试题, Go 语言的 make 和 new 有什么区别?
QA
Step 1
Q:: Go 语言的 make 和 new 有什么区别?
A:: 在 Go 语言中,make 和 new 是两个用于内存分配的内建函数,但它们的用途和行为有所不同。new 用于为类型分配内存,但只返回指向该类型的零值的指针,而不会对分配的内存进行进一步的初始化。make 则是用于创建和初始化一些内建的数据结构,如 slice、map 和 channel。make 返回的不是指针,而是数据结构的引用。例如,make 可以用于创建一个具有初始长度和容量的 slice,而 new 只是简单地分配内存。
Step 2
Q:: 为什么在 Go 中使用 make 而不是 new 来创建 slice?
A:: make 用于 slice 的原因是 slice 是一个三元组,包含指向底层数组的指针、长度和容量。new 只分配内存,不会初始化这三个字段,而 make 会初始化 slice 并返回这个三元组的引用。因此,make 是创建 slice、map 或 channel 的唯一正确方法,而 new 则用于分配内存并返回指针,适用于其他类型。
Step 3
Q:: 在什么情况下你会使用 new 而不是 make?
A:: new 通常用于分配结构体或者其他非引用类型的内存,并返回指向该内存的指针。例如,如果你需要一个指向结构体的指针并且需要零值初始化,你可以使用 new。相比之下,make 仅用于初始化 slice、map 或 channel,因为它们需要特定的初始化步骤,而不仅仅是内存分配。
用途
面试中问到 make 和 new 的区别,是为了测试候选人对 Go 语言内存管理的理解,以及在实际开发中选择合适工具的能力。在生产环境中,理解这些差异有助于编写更高效、更可靠的代码。例如,在处理大量数据时,选择正确的内存分配方式可以显著影响程序的性能和稳定性。了解 make 和 new 的区别也能帮助开发者避免常见的错误,如意外的 nil 指针或未初始化的数据结构。\n相关问题
🦆
Go 中 slice 的底层实现是什么?▷
🦆
Go 中 map 的扩容机制是怎样的?▷
🦆
channel 在 Go 中的作用是什么?如何使用?▷
🦆
Go 语言的垃圾回收机制如何运作?▷