話不多說先上代碼
package main
import "fmt"
func main() {
p := new([]int) //p == nil; with len and cap 0
fmt.Println(p)
v := make([]int, 10, 50) // v is initialed with len 10, cap 50
fmt.Println(v)
/*********Output****************
&[]
[0 0 0 0 0 0 0 0 0 0]
*********************************/
(*p)[0] = 18 // panic: runtime error: index out of range
// because p is a nil pointer, with len and cap 0
v[1] = 18 // ok
}
new
// The new built-in function allocates memory. The first argument is a type,
// not a value, and the value returned is a pointer to a newly
// allocated zero value of that type.
func new(Type) *Type
new函數它返回的永遠是類型的指針,指向分配類型的內存地址。同時請注意它同時把分配的內存置爲零,也就是類型的零值。
make
make也是用於內存分配的,但是和new不同,它只用於chan、map以及slice的內存創建,而且它返回的類型就是這三個類型本身,而不是他們的指針類型,因爲這三種類型就是引用類型,所以就沒有必要返回他們的指針了。
注意,因爲這三種類型是引用類型,所以必須得初始化,但是不是置爲零值,這個和new是不一樣的。
func make(t Type, size ...IntegerType) Type
二者異同
從函數聲明中可以看到,返回的還是該類型。所以從這裏可以看的很明白了,二者都是內存的分配(堆上),但是make只用於slice、map以及channel的初始化(非零值);而new用於類型的內存分配,並且內存置爲零。所以在我們編寫程序的時候,就可以根據自己的需要很好的選擇了。
make返回的還是這三個引用類型本身;而new返回的是指向類型的指針。
其實new不常用
所以有new這個內置函數,可以給我們分配一塊內存讓我們使用,但是現實的編碼中,它是不常用的。我們通常都是採用短語句聲明以及結構體的字面量達到我們的目的。make函數是無可替代的,我們在使用slice、map以及channel的時候,還是要使用make進行初始化,然後才纔可以對他們進行操作。