go語言中make和new有什么作用以及區(qū)別?
在Go語言中,make 和 new 是兩個內(nèi)置的函數(shù)(built-in functions),用于分配內(nèi)存,但它們之間有顯著的區(qū)別,主要體現(xiàn)在它們被用于不同類型的對象分配內(nèi)存。
new
new關(guān)鍵字用于分配內(nèi)存。更確切地說,它分配了零值初始化的內(nèi)存空間,并返回指向這個新分配類型的指針。它只用于內(nèi)建的數(shù)據(jù)類型(如int、float64、struct等),或者任何類型的指針、切片、映射、通道、函數(shù)等類型。但是,new 不會為切片、映射或通道初始化內(nèi)部數(shù)據(jù)結(jié)構(gòu),只會分配一個指向這些類型的零值的指針。
new 函數(shù)接受一個類型 Type 作為參數(shù),并返回一個指向該類型新分配零值的指針 *Type。
語法如下:
# 完整語法
var ptr *Type = new(Type)
# 簡寫
ptr := new(Type)
這里的 Type 是一個類型, 變量 ptr 是一個指向該類型零值內(nèi)存地址的指針。
實際編程中,通常我們會采用簡寫形式。
舉個栗子??,如下所示:
var ptr *int = new(int)
// 現(xiàn)在 ptr 指向一個 int 類型的零值0
*ptr = 2
fmt.Println(*ptr) // 輸出: 2
也可以簡寫成
ptr := new(int)
// 現(xiàn)在 ptr 指向一個 int 類型的零值0
*ptr = 2
fmt.Println(*ptr) // 輸出: 2
make
make 函數(shù)用于初始化內(nèi)置的數(shù)據(jù)結(jié)構(gòu)類型:切片(slice)、映射(map)和通道(channel)。它不僅分配了內(nèi)存,還返回了初始化(非零)后的(內(nèi)建的)值。
例如,對于切片,它返回了一個長度和容量都已初始化的切片;對于映射,它返回了一個空的映射(準備好接受鍵值對);
對于通道,它返回了一個可以進行通信的通道。
如下所示
slice := make([]Type, len, cap)
map := make(map[KeyType]ValueType)
channel := make(chan Type, capacity)
- []Type 表示切片的元素類型。
- len 是切片的長度。
- cap 是切片的容量(可選,默認為長度)。
- KeyType 是映射的鍵的類型。
- ValueType 是映射的值的類型。
- Type 是通道中元素的類型。
- capacity 是通道的容量(可選,對于無緩沖通道,容量為0)。
區(qū)別
- 用途:
new用于分配任意類型的內(nèi)存空間,并返回指向該空間的指針,它不會初始化內(nèi)存;make用于初始化切片、映射、通道等內(nèi)建的數(shù)據(jù)結(jié)構(gòu)類型。 - 返回值:
new返回的是一個指向類型的指針;make返回的是初始化后的(內(nèi)建的)值,比如切片、映射或通道。 - 零值:
new分配的類型被零值初始化;make初始化的切片、映射和通道則不是零值,它們有特定的初始狀態(tài)(比如,切片的長度和容量,空的映射,可以通信的通道)。 - 適用類型:
new適用于所有類型;make只適用于切片、映射和通道。
[支持/訂閱](https://afdian.com/a/taadis)作者,以獲得更多服務(wù).

浙公網(wǎng)安備 33010602011771號