go new() 和 make() 的區別

看起來兩者沒有什麼區別,都在堆上分配內存,可是它們的行爲不一樣,適用於不一樣的類型。數組

  • new(T) 爲每一個新的類型T分配一片內存,初始化爲 0 而且返回類型爲*T的內存地址:這種方法 返回一個指向類型爲 T,值爲 0 的地址的指針,它適用於值類型如數組和結構體;它至關於 &T{}
  • make(T) 返回一個類型爲 T 的初始值,它只適用於3種內建的引用類型:切片、map 和 channel

          換言之,new 函數分配內存,make 函數初始化;下圖給出了區別:函數

上兩個圖:spa

上圖中:指針

var p *[]int = new([]int) // *p == nil; with len and cap 0 p := new([]int)

在下圖中, p := make([]int, 0) ,切片 已經被初始化,可是指向一個空的數組。code

以上兩種方式實用性都不高。下面的方法:blog

var v []int = make([]int, 10, 50)

或者內存

v := make([]int, 10, 50)

這樣分配一個有 50 個 int 值的數組,而且建立了一個長度爲 10,容量爲 50 的 切片 v,該 切片 指向數組的前 10 個元素。it

相關文章
相關標籤/搜索