Go语言中的make与new:区别与最佳实践

Go语言中的make与new:区别与最佳实践

💡 原文英文,约1200词,阅读约需5分钟。
📝

内容提要

Go语言提供两种内存分配方式:new和make。new用于分配内存并返回指针,适用于所有类型,初始化为零值;make用于初始化切片、映射和通道,返回对象本身并支持指定容量。理解这两者的区别有助于编写高效的Go代码。

🎯

关键要点

  • Go语言提供两种内存分配方式:new和make。
  • new用于分配内存并返回指针,适用于所有类型,初始化为零值。
  • make用于初始化切片、映射和通道,返回对象本身并支持指定容量。
  • new的返回类型是指向类型的指针,初始化为零值。
  • make的返回类型是初始化后的对象(切片、映射或通道),而不是指针。
  • new适用于所有类型,而make仅适用于切片、映射和通道。
  • 使用new时,适合为结构体类型分配内存并返回指针。
  • 使用make时,可以指定切片、映射和通道的初始容量以优化性能。
  • 使用new创建切片或映射时会导致运行时错误,因为它只返回类型的零值。
  • 理解new和make的不同使用场景和性能影响有助于编写更高效的Go代码。

延伸问答

Go语言中的new和make有什么区别?

new用于分配内存并返回指向类型的指针,初始化为零值;make用于初始化切片、映射和通道,返回对象本身并支持指定容量。

在Go语言中,什么时候使用new比较合适?

使用new适合为结构体类型分配内存并返回指针,尤其在不需要特殊初始化时。

如何使用make初始化切片并指定容量?

可以使用make([]int, 5, 10)来初始化一个长度为5、容量为10的切片。

使用new创建切片会有什么问题?

使用new创建切片会导致运行时错误,因为它只返回类型的零值,而不进行初始化。

make和new在性能上有什么不同?

make在初始化切片、映射和通道时不仅分配内存,还进行类型初始化,可能会有额外开销;而new仅分配内存并初始化为零值,开销较小。

在Go语言中,如何正确使用make初始化映射?

应使用make(map[string]int)来初始化映射,这样可以避免运行时错误。

➡️

继续阅读