首頁 >後端開發 >Golang >golang make和new區別

golang make和new區別

(*-*)浩
(*-*)浩原創
2019-12-03 11:19:533071瀏覽

golang make和new區別

make、new操作

#make用於內建類型(map、slice 和channel)的記憶體分配。 new用於各種類型的記憶體分配。     (推薦學習:go

內建函數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返回初始化后的(非零)值。

程式碼範例:

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.

以上是golang make和new區別的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn