Go 語言中 new 和 make 都是內置函數,用於內存的分配,本文主要簡述二者使用上的異同與特性。spring
舉個例子:sql
func main() { var i *int *i = 1 fmt.Println(*i)}
上面的程序並不會打印1,而會拋 panic 異常,由於i是一個引用類型,須要給它分配內存空間,通俗來講就是指針(內存地址)須要指向一片內存空間纔有意義。
mybatis
爲 i 分配內存:架構
func main() { var i *int i = new(int) *i = 1 fmt.Println(*i)}
用 new 內置函數爲 i 分配內存空間,並返回該內存空間的地址,即指針,new 函數格式以下:
app
func new(Type) *Type
可知,new 爲每一個類型分配一片內存空間,初始化爲 0 並返回該內存空間的地址。
分佈式
new 的內存分配示意圖:ide
其實要說明一點的就是,new 不經常使用,咱們經常會經過結構體的字面量達到 new 的效果,並且這樣寫也比較優雅:函數
man := &People{Name: "zhangchenghui", Age: 18, Sex: "男"}
make 也是分配內存分配,可是僅限 chan、map、slice 的內存建立,並返回其類型的引用,這一點很重要, chan、map、slice 其自己已是引用類型了,因此make不須要再返回其指針,引用類型的本質就是指針!例如:源碼分析
type i *int;
如上,i 就是一個自定義的引用類型,其類型是一個 int 類型的指針。
ui
Make 內置函數格式:
func make(t Type, size ...IntegerType) Type
make 的內存分配示意圖:
近期熱文
Mybatis-spring源碼分析之註冊Mapper Bean
https://mp.weixin.qq.com/s/_FTH5GeWEo8IV9oOiqD3MA