加入收藏 | 设为首页 | 会员中心 | 我要投稿 PHP编程网 - 黄冈站长网 (http://www.0713zz.com/)- 数据应用、建站、人体识别、智能机器人、语音技术!
当前位置: 首页 > 站长资讯 > 传媒 > 正文

New 和 Make 是什么,差异在哪?

发布时间:2021-04-01 10:56:10 所属栏目:传媒 来源:互联网
导读:家好,我是煎鱼。 在 Go 语言中,有两个比较雷同的内置函数,分别是 new 和 make 方法,其主要用途都是用于分配相应类型的内存空间。 看上去 new 和 make 都是分配内存的,那他们有什么区别呢?这个细节点也成为了不少 Go 语言工程师的面试题之一,值得大家一

家好,我是煎鱼。

在 Go 语言中,有两个比较雷同的内置函数,分别是 new 和 make 方法,其主要用途都是用于分配相应类型的内存空间。

看上去 new 和 make 都是分配内存的,那他们有什么区别呢?这个细节点也成为了不少 Go 语言工程师的面试题之一,值得大家一看。

在这篇文章中我们将来解答这个问题。

基本特性

make

在 Go 语言中,内置函数 make 仅支持 slice、map、channel 三种数据类型的内存创建,其返回值是所创建类型的本身,而不是新的指针引用。

函数签名如下:

代码中,我们分别对三种类型调用了 make 函数进行了初始化。你会发现有的入参是有多个长度指定,有的没有。

这块的区别主要是长度(len)和容量(cap)的指定,有的类型是没有容量这一说法,因此自然也就无法指定。一个细节点要注意,调用 make 函数去初始化切片(slice)的类型时,会带有零值,需要明确是否需要。

见过不少的小伙伴在这上面踩坑。

new

在 Go 语言中,内置函数 new 可以对类型进行内存创建和初始化。其返回值是所创建类型的指针引用,与 make 函数在实质细节上存在区别。

函数签名如下:make 函数的区别,优势是什么呢?

本质上在于 make 函数在初始化时,会初始化 slice、chan、map 类型的内部数据结构,new 函数并不会。

例如:在 map 类型中,合理的长度(len)和容量(cap)可以提高效率和减少开销。

更进一步的区别:

  • make 函数:
    • 能够分配并初始化类型所需的内存空间和结构,返回引用类型的本身。
    • 具有使用范围的局限性,仅支持 channel、map、slice 三种类型。
    • 具有独特的优势,make 函数会对三种类型的内部数据结构(长度、容量等)赋值。
  • new 函数:
    • 能够分配类型所需的内存空间,返回指针引用(指向内存的指针)。
    • 可被替代,能够通过字面值快速初始化。

总结

在这篇文章中,我们介绍了 Go 语言中 make 和 new 函数的使用,并针对其区别点进行了分析。

可能会有小伙伴疑惑,那 new 和 make 函数所初始化出来的内存,是分配在堆还是栈上呢?

这就涉及到 Go 语言中的 “逃逸分析” 了(我公众号前几天的文章有发),

(编辑:PHP编程网 - 黄冈站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读