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`返回的是指向類型的指針。