在Go語言中,make
和 new
是兩個內建的函式(built-in functions),用於分配記憶體,但它們之間有顯著的區別,主要體現在它們被用於不同型別的物件分配記憶體。
new
new
關鍵字用於分配記憶體。更確切地說,它分配了零值初始化的記憶體空間,並返回指向這個新分配型別的指標。它只用於內建的資料型別(如int、float64、struct等),或者任何型別的指標、切片、對映、通道、函式等型別。但是,new 不會為切片、對映或通道初始化內部資料結構,只會分配一個指向這些型別的零值的指標。
new
函式接受一個型別 Type 作為引數,並返回一個指向該型別新分配零值的指標 *Type。
語法如下:
# 完整語法
var ptr *Type = new(Type)
# 簡寫
ptr := new(Type)
這裡的 Type
是一個型別, 變數 ptr
是一個指向該型別零值記憶體地址的指標。
實際程式設計中,通常我們會採用簡寫形式。
舉個例子🌰,如下所示:
var ptr *int = new(int)
// 現在 ptr 指向一個 int 型別的零值0
*ptr = 2
fmt.Println(*ptr) // 輸出: 2
也可以簡寫成
ptr := new(int)
// 現在 ptr 指向一個 int 型別的零值0
*ptr = 2
fmt.Println(*ptr) // 輸出: 2
make
make
函式用於初始化內建的資料結構型別:切片(slice)、對映(map)和通道(channel)。它不僅分配了記憶體,還返回了初始化(非零)後的(內建的)值。
例如,對於切片,它返回了一個長度和容量都已初始化的切片;對於對映,它返回了一個空的對映(準備好接受鍵值對);
對於通道,它返回了一個可以進行通訊的通道。
如下所示
slice := make([]Type, len, cap)
map := make(map[KeyType]ValueType)
channel := make(chan Type, capacity)
- []Type 表示切片的元素型別。
- len 是切片的長度。
- cap 是切片的容量(可選,預設為長度)。
- KeyType 是對映的鍵的型別。
- ValueType 是對映的值的型別。
- Type 是通道中元素的型別。
- capacity 是通道的容量(可選,對於無緩衝通道,容量為0)。
區別
- 用途:
new
用於分配任意型別的記憶體空間,並返回指向該空間的指標,它不會初始化記憶體;make
用於初始化切片、對映、通道等內建的資料結構型別。 - 返回值:
new
返回的是一個指向型別的指標;make
返回的是初始化後的(內建的)值,比如切片、對映或通道。 - 零值:
new
分配的型別被零值初始化;make
初始化的切片、對映和通道則不是零值,它們有特定的初始狀態(比如,切片的長度和容量,空的對映,可以通訊的通道)。 - 適用型別:
new
適用於所有型別;make
只適用於切片、對映和通道。