1. 程式人生 > >GO中的 new 和 make 的區別

GO中的 new 和 make 的區別

Go 語言中的 newmake 一直是新手比較容易混淆的東西,咋一看很相似。不過解釋兩者之間的不同也非常容易。 他們所做的事情,和應用的型別也不相同。
二者都是用來分配空間。

new 函式

  • new 是內建函式,函式原型為
func new(Type) *Type

內建函式 new 分配空間。傳遞給new 函式的是一個型別,不是一個值。返回值是 指向這個新分配的零值的指標。

make 函式

  • make 也是內建函式,它的函式原型 比 new 多了一個(長度)引數,返回值也不同。
func make(Type, size IntegerType) Type
  • 第一個引數是一個型別,第二個引數是長度
  • 返回值是一個型別

內建函式 make 分配並且初始化 一個 slice, 或者 map 或者 chan 物件。 並且只能是這三種物件。 和 new 一樣,第一個引數是 型別,不是一個值。 但是make 的返回值就是這個型別(即使一個引用型別),而不是指標。 具體的返回值,依賴具體傳入的型別。

例子:

var p *[]int = new([]int) 
var v []int = make([]int, 10)

上述第一條語句 使用 new() 函式為 切片結構分配記憶體,*p == nil (這意味著什麼? 意味著沒有對Slice結構進行初始化), 但是在實際中這種用法很少使用。
第二條語句使用 make() 函式建立了一個有10個元素的 Slice物件。

總結

  • new 的作用是 初始化 一個指向型別的指標 (*T)
  • make 的作用是為 slice, map 或者 channel 初始化,並且返回引用 T

make(T, args)函式的目的與new(T)不同。它僅僅用於建立 Slice, Map 和 Channel,並且返回型別是 T(不是T*)的一個初始化的(不是零值)的例項。 這中差別的出現是由於這三種類型實質上是對在使用前必須進行初始化的資料結構的引用。 例如, Slice是一個 具有三項內容的描述符,包括 指向資料(在一個數組內部)的指標,長度以及容量。在這三項內容被初始化之前,Slice的值為nil。對於Slice,Map和Channel, make()函式初始化了其內部的資料結構,並且準備了將要使用的值。