Go中的make和new的區別

2021-07-22 02:26:46 字數 619 閱讀 2455

make用於內建型別(map、slice 和channel)的記憶體分配。new用於各種型別的記憶體分配。

內建函式new本質上說跟其它語言中的同名函式功能一樣:new(t)分配了零值填充的t型別的記憶體空間,並且返回其位址,即乙個*t型別的值。用go的術語說,它返回了乙個指標,指向新分配的型別t的零值。有一點非常重要:new返回指標。

內建函式make(t, args)與new(t)有著不同的功能,make只能建立slice、map和channel,並且返回乙個有初始值(非零)的t型別,而不是*t。

本質來講,導致這三個型別有所不同的原因是指向資料結構的引用在使用前必須被初始化。例如,乙個slice,是乙個包含指向資料(內部array)的指標、長度和容量的三項描述符;在這些專案被初始化之前,slice為nil。對於slice、map和channel來說,make初始化了內部的資料結構,填充適當的值。make返回初始化後的(非零)值。

make 是 引用型別 初始化的方法。

上面位址提供了乙個make 和new 對應底層的記憶體分配圖。

Go語言new和make的區別

go有兩種分配原語,分別為new和make。他們做的事情不同,並且處理不同的型別,這看上去讓人感到困惑,但是規則相當簡單。new是乙個用來分配記憶體的內建函式 c 中是運算子 但他和大多數其他語言不同,new不會初始化記憶體 c 中會分配並呼叫建構函式 而是將記憶體歸0 也就是初始化成0 即,new...

go內建函式new和make的區別

new 內建函式分配記憶體。其第乙個實參為型別,而非值,其返回值為指向該型別的新分配的零值的指標。make 內建函式分配並初始化乙個型別為且僅為slice map 或chan的物件。與 new 相同的是,其第乙個實參為型別,而非值。不同的是,make 的返回型別 與其引數相同,而非指向它的指標。其具...

go語言中make和new的區別

make用於內建型別 map slice 和channel 的記憶體分配。new用於各種型別的記憶體分配。內建函式new本質上說跟其他語言中的同名函式功能一樣 new t 分配了零值填充的t型別的記憶體空間,並且返回其位址,即乙個 t型別的值。用go語言的術語說,它返回了乙個指標,指向新分配的型別t...