go new() 和 make() 的區別


看起來二者沒有什么區別,都在堆上分配內存,但是它們的行為不同,適用於不同的類型。

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

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

上兩個圖:

上圖中:

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

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

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

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

或者

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

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM