Go 語言中的 new() 和 make() 的區別
阿新 • • 發佈:2019-02-16
http://se77en.cc/2014/04/25/the-difference-between-function-new-and-make-in-golang/
概述
Go 語言中的 new
和 make
一直是新手比較容易混淆的東西,咋一看很相似。不過解釋兩者之間的不同也非常容易。
new 的主要特性
1 |
func new(Type) *Type |
官方文件對於它的描述是:
內建函式
new
用來分配記憶體,它的第一個引數是一個型別,不是一個值,它的返回值是一個指向新分配型別零值的指標
根據這段描述,我們可以自己實現一個類似 new
的功能:
1 2 3 4 5 6 |
func |
我們這個函式的功能跟 someInt := new(int)
一模一樣。所以在我們自己定義 new 開頭的函式時,出於約定也應該返回型別的指標。
make 的主要特性
1 |
func make(Type, size IntegerType) Type |
官方文件對於它的描述是:
內建函式
make
用來為slice
,map
或chan
型別分配記憶體和初始化一個物件(注意:只能用在這三種類型上),跟new
類似,第一個引數也是一個型別而不是一個值,跟new
不同的是,make
返回型別的引用而不是指標,而返回值也依賴於具體傳入的型別,具體說明如下:
1 2 3 4 5 6 7 |
Slice: 第二個引數 size 指定了它的長度,它的容量和長度相同。 你可以傳入第三個引數來指定不同的容量值,但必須不能比長度值小。 比如 make([]int, 0, 10) Map: 根據 size 大小來初始化分配記憶體,不過分配後的 map 長度為 0,如果 size 被忽略了,那麼會在初始化分配記憶體時分配一個小尺寸的記憶體 Channel: 管道緩衝區依據緩衝區容量被初始化。如果容量為 0 或者忽略容量,管道是沒有緩衝區的 |
總結
new
的作用是初始化一個指向型別的指標(*T
make
的作用是為 slice
,map
或 chan
初始化並返回引用(T
)。