GoLang - 語言基礎: Make 與 New 差別

Golang - 語言基礎 Slice

在這幾篇,會以 Go 語言的入門基礎進行逐步說明,本篇針對 Make 與 New 進行說明

前面介紹 Map 時,有提到透過 make 宣告 array。這裡會說明 Make 以及 New ,各自的功能及作用。

Make

Make 是專門用於 map, slice 以及 channel 初始化,負責在記憶體分配,建立成功會回傳一個T類型(泛型)的初始值(不會回傳 *T 指標),這個初始值會針對內部結構填充值,填充的形式類似 [000],例如建立 slice 時,slice 會指向一個內部的 array或 slice 的 index, length 以及容量,在 make 建立時,會預設先填好一些適當的值來完成初始化程序,例如,不使用 make 時,初始化一個 map 我們需要填入一個預設值才不會出錯:

mapName := map[string]int{}  //這裡需要預設值才不會報錯
fmt.Println(mapName)
//output map[]

mapName["hello"] = 123
fmt.Println(mapName)
//output map[hello:123]

使用 Make 則可省略塞入預設值

mapName := make(map[string]int)
fmt.Println(mapName)
//output map[]

mapName["hello"] = 123
fmt.Println(mapName)
//output map[hello:123]

New

New 是一個分配記憶體的函式,可以用在各種類型,進行記憶體分配,並且回傳 *T 類型的指標,在將這值以 zeroed value 方式指向新分配的類型T。完成分配後,map, slice, channel 會填充預設值 nil,string 則為空字串,number 則為 0。

例如:

i := new(int)
fmt.Println(i)
//output 0xc00012c008
fmt.Println(*i)
//output 0
*i = 10
fmt.Println(*i)
//output 10

以下方範例來說明,如果在 new 來分配 map,預設會取得一個 nil 的 *T,如果在這時要輸出 map 或進行 key value操作,就會出現 ```panic:

CVT2HUGO: assignment to entry in nil map``` 錯誤
newMapName := new(map[string]int)
mapName := *newMapName
fmt.Println(mapName)

mapName["hello"] = 123  //噴錯
fmt.Println(mapName)