當前位置:成語大全網 - 新華字典 - new和make的區別?

new和make的區別?

它們都是內置函數,new按指定類型長度分配零值內存,返回指針,並不關系類型內部構造和初始化方式。而引用類型則必須使用make函數創建,編譯器會將make轉化為目標類型專用的創建函數(或指令),以保證完成全部內存分配和相關屬性初始化。

new可以為引用類型分配內存,但這是不完整創建。以字典(map)為例,它僅分配了字典類型本身(實際就是個指針包裝)所需內存,並沒有分配鍵值存儲內存,也沒有初始化散列桶等內部屬性,因此它無法正常工作。

p := new(map[string]int) // 函數new返回指針

m := *p

m["a"] = 1 // panic: assignment to entry in nil map (運行期錯誤

使用make初始化引用類型

切片的存儲形式 unsafe.pointer len cap

只聲明不賦值時

使用make初始化時 會分配底層數組

使用new初始化引用類型

使用new初始化引用類型 (new的返回值就是slice結構的起始地址,不會分配底層數組,所以此時賦值時不允許的)

使用append的方式添加元素,可以分配底層數組

參考: Golangslice類型存什麽?make和new?slice和數組?擴容規則?_嗶哩嗶哩_bilibili