看起來二者沒有什么區別,都在堆上分配內存,但是它們的行為不同,適用於不同的類型。
- new(T) 為每個新的類型T分配一片內存,初始化為 0 並且返回類型為*T的內存地址:這種方法 返回一個指向類型為 T,值為 0 的地址的指針,它適用於值類型如數組和結構體;它相當於
&T{}
。 - make(T) 返回一個類型為 T 的初始值,它只適用於3種內建的引用類型:切片、map 和 channel
換言之,new 函數分配內存,make 函數初始化;下圖給出了區別:
上兩個圖:
上圖中:
var p *[]int = new([]int) // *p == nil; with len and cap 0 p := new([]int)
在下圖中, p := make([]int, 0)
,切片 已經被初始化,但是指向一個空的數組。
以上兩種方式實用性都不高。下面的方法:
var v []int = make([]int, 10, 50)
或者
v := make([]int, 10, 50)
這樣分配一個有 50 個 int 值的數組,並且創建了一個長度為 10,容量為 50 的 切片 v,該 切片 指向數組的前 10 個元素。