go語言中make和new有什麼作用以及區別?

taadis發表於2024-08-15

在Go語言中,makenew 是兩個內建的函式(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 只適用於切片、對映和通道。

相關文章