看起來二者沒有什麼區別,都在堆上分配記憶體,但是它們的行為不同,適用於不同的型別。
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 個元素。
go new和make開闢記憶體
內建函式new按指定型別長度分配零值記憶體,返回指標,並不關心型別內部構造和初始化方式。而引用型別則必須使用make函式建立,編譯器會將make轉換為目標型別專用的建立函式 或指令 以確保完成全部記憶體分配和相關屬性初始化。當然,new函式也可為引用型別分配記憶體,但這是不完整建立。以字典 map ...
gmake和make 的區別
這幾天在發現還有個gmake,不清楚和make的區別,所以查來看看,並記下來,方便查詢。gmake是gnu make的縮寫。linux系統環境下的make就是gnu make,之所以有gmake,是因為在別的平台上,make一般被占用,gnu make只好叫gmake了。比如在安裝二進位制檔案進行編...
new 和 make 的區別
看起來二者沒有什麼區別,都在堆上分配記憶體,但是它們的行為不同,適用於不同的型別。make t 返回乙個型別為 t 的初始值,它只適用於3種內建的引用型別 切片 map 和 channel。換言之,new 函式分配記憶體,make 函式初始化 下圖給出了區別 var v int make int,1...