1. 程式人生 > >Golang中make與new

Golang中make與new

轉自:https://www.cnblogs.com/junneyang/p/6070238.html

 

make、new操作

make用於內建型別(mapslice 和channel)的記憶體分配。new用於各種型別的記憶體分配。

內建函式new本質上說跟其它語言中的同名函式功能一樣:new(T)分配了零值填充的T型別的記憶體空間,並且返回其地址,即一個*T型別的值。用Go的術語說,它返回了一個指標,指向新分配的型別T的零值。有一點非常重要:

new返回指標。

內建函式make(T, args)new(T)有著不同的功能,make只能建立slice

mapchannel,並且返回一個有初始值(非零)的T型別,而不是*T。本質來講,導致這三個型別有所不同的原因是指向資料結構的引用在使用前必須被初始化。例如,一個slice,是一個包含指向資料(內部array)的指標、長度和容量的三項描述符;在這些專案被初始化之前,slicenil。對於slicemapchannel來說,make初始化了內部的資料結構,填充適當的值。

make返回初始化後的(非零)值。

下面這個圖詳細的解釋了newmake之間的區別。

 

零值

關於“零值”,所指並非是空值,而是一種“變數未填充前”的預設值,通常為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.