分享
[Go - note] go中new和make分配变量的区别
Arboat · · 982 次点击 · · 开始浏览这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。
New
与其他语言中的同名方法不同是,go中的new不会初始化内存,而仅仅是赋予零值,也就是说返回一个新分配的类型的零值的指针(*T)。这样创建的变量可以不用进一步初始化就可以直接使用。
但有时需要初始化为非零值则可以用composite literal方式。
filed name 可根据是否需要按key:value 方式填写。
`new(File)`and`&File{}`
是相同的表达
Make
make只用来创建slice, map, 和channel,并且返回的初始化的值(T)
而非零值(*T),因为这几种类型的都需要初始化才能使用。
make([]int, 10, 100)
返回的是length 10 , capacity100的slice, 而new([]int)返回一个指向零值的slice。
下面的例子可以看出区别
var p *[]int = new([]int) // allocates slice structure; \*p == nil; rarely useful
var v []int = make([]int, 100) // the slice v now refers to a new array of 100 ints
// Unnecessarily complex:
var p *[]int = new([]int)
*p = make([]int, 100, 100)
// Idiomatic:
v := make([]int, 100)
有疑问加站长微信联系(非本文作者)
入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889
关注微信982 次点击
上一篇:golang数组
下一篇:使用 Go 优化我们的接口
添加一条新回复
(您需要 后才能回复 没有账号 ?)
- 请尽量让自己的回复能够对别人有帮助
- 支持 Markdown 格式, **粗体**、~~删除线~~、
`单行代码` - 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
- 图片支持拖拽、截图粘贴等方式上传
收入到我管理的专栏 新建专栏
New
与其他语言中的同名方法不同是,go中的new不会初始化内存,而仅仅是赋予零值,也就是说返回一个新分配的类型的零值的指针(*T)。这样创建的变量可以不用进一步初始化就可以直接使用。
但有时需要初始化为非零值则可以用composite literal方式。
filed name 可根据是否需要按key:value 方式填写。
`new(File)`and`&File{}`
是相同的表达
Make
make只用来创建slice, map, 和channel,并且返回的初始化的值(T)
而非零值(*T),因为这几种类型的都需要初始化才能使用。
make([]int, 10, 100)
返回的是length 10 , capacity100的slice, 而new([]int)返回一个指向零值的slice。
下面的例子可以看出区别
var p *[]int = new([]int) // allocates slice structure; \*p == nil; rarely useful
var v []int = make([]int, 100) // the slice v now refers to a new array of 100 ints
// Unnecessarily complex:
var p *[]int = new([]int)
*p = make([]int, 100, 100)
// Idiomatic:
v := make([]int, 100)