GoLang - 語言基礎: Make 與 New 差別
在這幾篇,會以 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)