Golang中make與new
阿新 • • 發佈:2018-11-29
轉自:https://www.cnblogs.com/junneyang/p/6070238.html
make、new操作
make
用於內建型別(map
、slice
和channel
)的記憶體分配。new
用於各種型別的記憶體分配。
內建函式new
本質上說跟其它語言中的同名函式功能一樣:new(T)
分配了零值填充的T
型別的記憶體空間,並且返回其地址,即一個*T
型別的值。用Go的術語說,它返回了一個指標,指向新分配的型別T
的零值。有一點非常重要:
new
返回指標。
內建函式make(T, args)
與new(T)
有著不同的功能,make只能建立slice
map
和channel
,並且返回一個有初始值(非零)的T
型別,而不是*T
。本質來講,導致這三個型別有所不同的原因是指向資料結構的引用在使用前必須被初始化。例如,一個slice
,是一個包含指向資料(內部array
)的指標、長度和容量的三項描述符;在這些專案被初始化之前,slice
為nil
。對於slice
、map
和channel
來說,make
初始化了內部的資料結構,填充適當的值。
make
返回初始化後的(非零)值。
下面這個圖詳細的解釋了new
和make
之間的區別。
零值
關於“零值”,所指並非是空值,而是一種“變數未填充前”的預設值,通常為0。 此處羅列 部分型別 的 “零值”
int 0 int8 0 int32 0 int64 0 uint 0x0 rune 0 //rune的實際型別是 int32 byte 0x0 // byte的實際型別是 uint8 float32 0 //長度為 4 byte float64 0 //長度為 8 byte bool false string ""
var map1 map[string]string = make(map[string]string) fmt.Println(map1) fmt.Println(map1 == nil) var map2 *map[string]string = new(map[string]string) fmt.Println(map2) fmt.Println(map2 == nil) fmt.Println(*map2) fmt.Println(*map2 == nil) // var map1 map[string]string map1["aaa"] = "AAA" map1["bbb"] = "BBB" map1["ccc"] = "CCC" fmt.Println(map1) fmt.Println(len(map1)) 輸出: map[] false &map[] false map[] true map[bbb:BBB ccc:CCC aaa:AAA] Success: process exited with code 0.