Golang中new和make的区别

玲珑创世 · · 653 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

简而言之:他们的区别在于new分配内存,make初始化slice,map和channel类型。

内置函数make(T,args) 与new(T)的目的不同。make只创建slice,map和channel,返回一个类型T的一个初始化值(非0值). 产生这种区别的原因在于这三种类型在隐藏着表示对在使用前必须初始化的数据结构的引用。一个切片,是一个具有3 个item的描述符,它包含一个指向数据的指针,长度和容量。在初始化这item之前,这个slice就是nil。对应slice,map,channel来说,make初始化内部的数据结构并准备要使用的值的。例如

make([]int,10,100)

分配一个有100个整数的数据组并创建一个slice结构,这个slice长度为10,容量为100并指向数组的前10个元素。make slice时,容量参数可以省略。相反,new([]int) 返回一个指向新分别的0值的slice的指针,也就是一个指向nil值的指针。

var p *[]int = new([]int)       //分配slice结构; *p == nil; rarely useful
var v  []int = make([]int, 100) //v现在引用一个有100个int的数组

// 不必要的复杂
var p *[]int = new([]int)
*p = make([]int, 100, 100)

// 惯用方法:
v := make([]int, 100)

有疑问加站长微信联系(非本文作者)

本文来自:简书

感谢作者:玲珑创世

查看原文:Golang中new和make的区别

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

653 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传