1. 程式人生 > >Go 語言中的 new() 和 make() 的區別

Go 語言中的 new() 和 make() 的區別

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
newInt() *int { var i int return &i } someInt := newInt()

我們這個函式的功能跟 someInt := new(int) 一模一樣。所以在我們自己定義 new 開頭的函式時,出於約定也應該返回型別的指標。

make 的主要特性

1
func make(Type, size IntegerType) Type

官方文件對於它的描述是:

內建函式 make 用來為 slicemap 或 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 的作用是為 slicemap 或 chan 初始化並返回引用(T)。