go new 和 make 的區別

2022-06-15 20:12:11 字數 610 閱讀 8875

看起來二者沒有什麼區別,都在堆上分配記憶體,但是它們的行為不同,適用於不同的型別。

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...