golang中的new和make的区别
new
這是一個用來分配內存的內建函數,但是與C++不一樣的是,它并不初始化內存,只是將其置零。也就是說,new(T)會為T類型的新項目,分配被置零的存儲,并且返回它的地址,一個類型為*T的值。在Go的術語中,其返回一個指向新分配的類型為T的指針,這個指針指向的內容的值為零(zero value)。注意并不是指針為零。
Go語言中的對象沒有C++中的構造函數,如果用C來描述,Go中的new大概相當于:
T *t = (T*)malloc(sizeof(T))
memset(t, 0,?sizeof(T))
其實,上面的描可能也不是很準確,也許用*t=zerovalue更準確。因為對于不同的數據類型,零值的意義是完全不一樣的。比如,對于bool類型,零值為false;int的零值為0;string的零值是空字符串
make
內建函數make(T,?args)與new(T)的用途不一樣。它只用來創建slice,map和channel,并且返回一個初始化的(而不是置零),類型為T的值(而不是*T)。之所以有所不同,是因為這三個類型的背后引用了使用前必須初始化的數據結構。例如,slice是一個三元描述符,包含一個指向數據(在數組中)的指針,長度,以及容量,在這些項被初始化之前,slice都是nil的。對于slice,map和channel,make初始化這些內部數據結構,并準備好可用的值
記住make只用于map,slice和channel,并且不返回指針。
要獲得一個顯式的指針,使用new進行分配,或者顯式地使用一個變量的地址
總結
以上是生活随笔為你收集整理的golang中的new和make的区别的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: golang中的Mock依赖
- 下一篇: golang中的time详情