interview
go-basics
Go语言的make和new有什么区别?

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 的底层实现是什么?

slice 是 Go 语言中常用的数据结构,其底层实现为一个三元组,包含指向底层数组的指针、slice 的长度和容量。slice 的实际数据存储在一个连续的底层数组中。

🦆
Go 中 map 的扩容机制是怎样的?

Go 中的 map 是一个哈希表,其扩容机制包括动态扩展容量,以处理更多的键值对。当 map 的负载因子达到某个阈值时,Go 会自动进行扩容,重新哈希并分配新的存储空间。

🦆
channel 在 Go 中的作用是什么?如何使用?

channel 是 Go 中用于在 goroutine 之间进行通信的管道。通过 channel,可以安全地在多个 goroutine 之间传递数据,而无需显式锁定。使用时可以通过 make 创建无缓冲或有缓冲的 channel,并通过 <- 操作符发送和接收数据。

🦆
Go 语言的垃圾回收机制如何运作?

Go 语言使用标记-清除算法的垃圾回收机制。垃圾回收器定期扫描内存中的对象,标记不再使用的对象,并释放它们占用的内存空间。了解垃圾回收机制有助于优化程序的性能,特别是在内存密集型应用中。