Go 中 make 与 new 的区别是什么?

2020-01-24 14:09:14 +08:00
 w708833018
我理解的是:
- new 会初始化值类型(如果 int,string,struct ),并返回指向该类型值的指针
- ( make/slice/chan )使用 make,make 返回的是类型本身,引用类型没必要返回他们的指针

但是网上经常出现这样的解释:
- new 是用来分配内存的内建函数, 但与其它语言中的同名函数不同,它不会“初始化内存”,只会将“内存置零"
- make 只用于创建切片、映射和信道,并返回类型为 T (而非 *T )的一个已初始化 (而非置零)的值

我不明白,初始化内存,内存置零有什么区别,内存都置零了,难道还没有初始化内存吗
6464 次点击
所在节点    Go 编程语言
13 条回复
lhx2008
2020-01-24 14:12:11 +08:00
new 就只是内存分配了,make 就是再做个初始化之类的
lhx2008
2020-01-24 14:13:20 +08:00
初始化我理解就是执行了构造函数了
noO9LeRxXX
2020-01-24 14:32:17 +08:00
举个例子,slice 要存 length 和 capacity,这些都可以不为零,所以不能用 new。具体 Effective Go 里有讲。
monsterxx03
2020-01-24 15:02:23 +08:00
new 只是&T{}的一个语法糖
Cbdy
2020-01-24 15:12:21 +08:00
基本没有区别
ChristopherWu
2020-01-24 15:16:10 +08:00
* `new` 会申请内存并全部清 0
* `make`会申请内存并初始化该类型

像 `make([]int, 10, 100)` 这种情况就必须要用`make`初始化,因为需要初始化 `length`, `capacity`

```
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
```
Hellert
2020-01-24 15:19:57 +08:00
new 新建任意类型的指针。
make 只能用于切片,map,通道,其他类型是不能用的。
chitanda
2020-01-24 19:56:07 +08:00
请去看一遍官方的 effective go
secondwtq
2020-01-24 22:54:09 +08:00
看起来像是 c++的 new 和 malloc 的区别……
wweir
2020-01-26 08:00:08 +08:00
神经病式的面试官喜欢问这问题。
实际没啥区别,都是申请内存、初始化,无非作用对象不同
wweir
2020-01-26 08:02:06 +08:00
非要说区别的话,make 可以多加俩参数
:狗头:
lazydog
2020-01-26 11:15:22 +08:00
曾被面试官问到过。你可以理解为:make 用来初始化 Go 的内部数据结构,new 用来创建一个指向返回类型的指针。或者参考这里: https://draveness.me/golang/docs/part2-foundation/ch05-keyword/golang-make-and-new/
Mithrandir
2020-01-27 13:31:50 +08:00
请去看一遍官方的 effective go

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/640157

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX