new和make是内建的两个函数,主要用来创建分配类型内存。
#### 1、new函数是内建函数,函数定义为
```
func new(Type) *Type
```
new 的作用是初始化一个指向类型的指针(*Type ),使用new函数来分配空间。传递给new 函数的是一个类型,不是一个值。返回值是 指向这个新分配的零值的指针。
#### 实例
~~~
package main
import (
"fmt"
)
func main() {
a := new([]int)
fmt.Println(a) //输出&[],a本身是一个地址
}
~~~
运行结果:
&[]
#### 实例2
~~~
package main
import "fmt"
func main() {
var i *int
fmt.Println("没有new之前I得值为:", i)
i = new(int)
fmt.Println("new之后I得值为:", i)
}
~~~
执行结果:
```
没有new之前I得值为: <nil>
new之后I得值为: 0xc0000aa058
```
#### 2、make函数是内建函数,函数定义为
#### 定义
`make`也是用于内存分配的,make(T, args)函数的目的与new(T)不同,make只用于`chan`、`map`以及slice(切片)的内存创建,而且它返回的类型就是这三个类型本身,而不是他们的指针类型,因为这三种类型就是引用类型,所以就没有必要返回他们的指针了。
```
func make(t Type, size ...IntegerType) Type
```
第一个参数是一个类型,第二个参数是长度。
make返回类型是 T(不是T*)的一个初始化的(不是零值)的实例。
make实例:
~~~
var slice1 []type = make([]type, len)
也可以简写为
slice1 := make([]type, len)
~~~
实例:
~~~
package main
import (
"fmt"
)
func main() {
b := make([]int, 1)
fmt.Println(b) //输出[0],b本身是一个slice对象,其内容默认为0
}
~~~
运行结果:
[0]
#### 注意:
a、简单来说,new只是分配内存,不初始化内存; 而make即分配又初始化内存。所谓的初始化就是给类型赋初值,比如字符为空,整型为0, 逻辑值为false等。
b、当对slice,map以及channel进行初始化时,使用make比new方式要好,而其他形式的则利用new进行初始化
c、new 的作用是初始化一个指向类型的指针(*T),make 的作用是为 slice,map 或 chan 初始化并返回引用(T)。
d、二者都是内存的分配(堆上),但是`make`只用于slice、map以及channel的初始化(非零值);而`new`用于类型的内存分配,并且内存置为零。
e、`make`返回的还是这三个引用类型本身;而`new`返回的是指向类型的指针。