Golang中new和make的區別
簡而言之:他們的區別在於new分配記憶體,make初始化slice,map和channel型別。
內建函式make(T,args) 與new(T)的目的不同。make只建立slice,map和channel,返回一個型別T的一個初始化值(非0值). 產生這種區別的原因在於這三種類型在隱藏著表示對在使用前必須初始化的資料結構的引用。一個切片,是一個具有3 個item的描述符,它包含一個指向資料的指標,長度和容量。在初始化這item之前,這個slice就是nil。對應slice,map,channel來說,make初始化內部的資料結構並準備要使用的值的。例如
make([]int,10,100)
分配一個有100個整數的資料組並建立一個slice結構,這個slice長度為10,容量為100並指向陣列的前10個元素。make slice時,容量引數可以省略。相反,new([]int) 返回一個指向新分別的0值的slice的指標,也就是一個指向nil值的指標。
var p *[]int = new([]int)//分配slice結構; *p == nil; rarely useful var v[]int = make([]int, 100) //v現在引用一個有100個int的陣列 // 不必要的複雜 var p *[]int = new([]int) *p = make([]int, 100, 100) // 慣用方法: v := make([]int, 100)