Golang new和 make的區別
阿新 • • 發佈:2018-12-01
Golang new和 make的區別
Go提供了兩種分配原語,即new和make。它們所做的事情是不一樣的,所應用的型別也不同。
new用來分配記憶體,但與其他語言中的同名函式不同,它不會初始化記憶體,只會講記憶體置零;也就是說,new(T)會為型別為T的新項分配已置零的記憶體空間,並返回他的地址,也就是一個型別為*T的值。用Go的術語來說,它返回一個指標,改指標指向新分配的,型別為T的零值;
make的目的不同於new,它只用於slice,map,channel的建立,並返回型別為T(非指標)的已初始化(非零值)的值;出現這種差異的原因在於,這三種類型本質上為引用型別,它們在使用前必須初始化;
小結:
new和make都在堆上分配記憶體,但是它們的行為不同,適用於不同的型別。
new(T) 為每個新的型別T分配一片記憶體,初始化為 0 並且返回型別為*T的記憶體地址:這種方法 返回一個指向型別為 T,值為 0 的地址的指標,它適用於值型別如陣列和結構體;它相當於 &T{}。
make(T) 返回一個型別為 T 的初始值,它只適用於3種內建的引用型別:slice、map 和 channel。
換言之,new 函式分配記憶體,make 函式初始化;下圖給出了區別:
</br>
通過實驗,可以更直觀的檢視兩者之間的區別
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 }