Golang中,make
與new
都是建構變數來使用
new的介紹
new(T)會建構一個T型別的 “沒有名字” 的變數,以T的zeroed value來初始化T,且new(T) 回傳 “指向T的指標”
- 若T是 string,那zeroed值為
""
- 若T是 int,那zeroed值為
0
- 若T是 channel, func, map, slice,那zeroed值為
nil
範例
1 | p := new(int) // 宣告一個指向int不具名變數的`指標p`,`指標p`指向一個初始化的zeroed value為0 |
其中new算是golang語法的簡寫,其中
1 | func newInt() *int { |
就等於下列寫法
1 | func newInt() *int { |
注意: 謹慎操作new出來的map
因為用new
初始化的map會是 nil map,故以下操作會出現panic
1 | func main() { |
上述範例會出錯的原因是因為, b是一個nil map,沒有指向任何的記憶體位置,所以對一個nil值操作當然會冒出error
解法就得透過 make
方法為nil map分配確定的內存地址了
new
不是 Keyword
要注意一點是 new
並非是golang的關鍵字,故可以在func內重新宣告
1 | func delta(old, new int) int { |
make的介紹
make(T, args)
用來為slices
,maps
, 以及channel
分配其記憶體位址的空間與初始化值,並回傳一個型態T
的參考!- make不會回傳指標!
範例
1 | func main() { |
由於make
回傳的是參考,所以若將make宣告的s2
傳給func modifySlice
對s2
做修改時,也會影響s2
的內容
1 | func modifySlice(s []int) { |
new與make的差異
- new會回傳指標,但是初始化的值為zeroed value,特別是在對map做初始化時,其zeroed valued為
nil
,意思就是不會分配其記憶體位置 - make只能用來對特別型態(如map, slice, func, channle)分配其記憶體內存地址,以及為這些特殊型態設定該初始值 (string就是"", int為0)
所以若要傳指標時,就需要考慮用new
,而非是make
了
參考
- golang 筆記:make 與 new 的差別 by 愷開
- Allocation with make
- Allocation with new
- The Go Programming Language, Author: Alan A. A. Donovan, Brian W. Kernighan
- 不要向nil map写入(panic: assignment to entry in nil map) #7
- 理解 Go make 和 new 的区别 by 三月沙