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 是 引用類型 初始化的方法。
參考:https://github.com/astaxie/build-web-application-with-golang/blob/master/02.2.md
上面地址提供了一個make 和new 對應底層的內存分配圖。