This topic created in 2310 days ago, the information mentioned may be changed or developed.
我理解的是:
- new 会初始化值类型(如果 int,string,struct ),并返回指向该类型值的指针
- ( make/slice/chan )使用 make,make 返回的是类型本身,引用类型没必要返回他们的指针
但是网上经常出现这样的解释:
- new 是用来分配内存的内建函数, 但与其它语言中的同名函数不同,它不会“初始化内存”,只会将“内存置零"
- make 只用于创建切片、映射和信道,并返回类型为 T (而非 *T )的一个已初始化 (而非置零)的值
我不明白,初始化内存,内存置零有什么区别,内存都置零了,难道还没有初始化内存吗
13 replies • 2020-01-27 13:31:50 +08:00
 |
|
1
lhx2008 Jan 24, 2020 via Android
new 就只是内存分配了,make 就是再做个初始化之类的
|
 |
|
2
lhx2008 Jan 24, 2020 via Android
初始化我理解就是执行了构造函数了
|
 |
|
3
noO9LeRxXX Jan 24, 2020 via iPhone
举个例子,slice 要存 length 和 capacity,这些都可以不为零,所以不能用 new。具体 Effective Go 里有讲。
|
 |
|
5
Cbdy Jan 24, 2020 via Android
基本没有区别
|
 |
|
6
huoru Jan 24, 2020
* `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 ```
|
 |
|
7
Hellert Jan 24, 2020 via Android
new 新建任意类型的指针。 make 只能用于切片,map,通道,其他类型是不能用的。
|
 |
|
8
chitanda Jan 24, 2020 via iPhone
请去看一遍官方的 effective go
|
 |
|
9
secondwtq Jan 24, 2020 via iPhone
看起来像是 c++的 new 和 malloc 的区别……
|
 |
|
10
wweir Jan 26, 2020 via Android
神经病式的面试官喜欢问这问题。 实际没啥区别,都是申请内存、初始化,无非作用对象不同
|
 |
|
11
wweir Jan 26, 2020 via Android
非要说区别的话,make 可以多加俩参数 :狗头:
|