文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Go 面试题: New 和 Make 是什么,差异在哪?

2024-12-03 10:22

关注

本文转载自微信公众号「脑子进煎鱼了」,作者陈煎鱼。转载本文请联系脑子进煎鱼了公众号。  

大家好,我是煎鱼。

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

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

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

基本特性

make

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

函数签名如下:

  1. func make(t Type, size ...IntegerType) Type 

具体使用示例:

  1. func main() { 
  2.  v1 := make([]int, 1, 5) 
  3.  v2 := make(map[int]bool, 5) 
  4.  v3 := make(chan int, 1) 
  5.      
  6.  fmt.Println(v1, v2, v3) 

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

这块的区别主要是长度(len)和容量(cap)的指定,有的类型是没有容量这一说法,因此自然也就无法指定。

输出结果:

  1. [0] map[] 0xc000044070 

有一个细节点要注意,调用 make 函数去初始化切片(slice)的类型时,会带有零值,需要明确是否需要。

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

new

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

函数签名如下:

  1. func new(Type) *Type 

具体使用示例:

  1. type T struct { 
  2.  Name string 
  3.  
  4. func main() { 
  5.  v := new(T) 
  6.  v.Name = "煎鱼" 

从上面的例子的效果来看,是不是似曾相似?其实与下面这种方式的一样的:

  1. func main() { 
  2.  v := T{} 
  3.  v.Name = "煎鱼" 

输出结果均是:

  1. &{Name:煎鱼} 

其实 new 函数在日常工程代码中是比较少见的,因为他可被替代。

一般会直接用快捷的 T{} 来进行初始化,因为常规的结构体都会带有结构体的字面属性:

  1. func NewT() *T { 
  2.  return &T{Name"煎鱼"

这种初始化方式更方便。

区别在哪里

可能会有的小伙伴会疑惑一点,就是 new 函数也能初始化 make 的三种类型:

  1. v1 := new(chan bool) 
  2. v2 := new(map[string]struct{}) 

那 make 函数的区别,优势是什么呢?

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

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

更进一步的区别:

总结

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

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

 

这就涉及到 Go 语言中的 “逃逸分析” 了(我公众号前几天的文章有发),如果所初始化的变量不需要在当前作用域外生存,那么理论上就不需要初始化在堆上。

 

来源:脑子进煎鱼了内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯