引用型別介紹
Golang的引用型別包括 slice、map 和 channel。它們有複雜的內部結構,除了申請記憶體外,還需要初始化相關屬性。
內建函式 new 計算型別大小,為其分配零值記憶體,返回指標。而 make 會被編譯器翻譯 成具體的建立函式,由其分配記憶體和初始化成員結構,返回物件而非指標。
package main func main() { a := []int{0, 0, 0} // 提供初始化表示式。 a[1] = 10 b := make([]int, 3) // make slice b[1] = 10 c := new([]int) c[1] = 10 // ./main.go:11:3: invalid operation: c[1] (type *[]int does not support indexing) }
引用型別:
變數儲存的是一個地址,這個地址儲存最終的值。記憶體通常在堆上分配。通過GC回收。 獲取指標型別所指向的值,使用:" * " 取值符號 。比如:var *p int, 使用*p獲取p指向的值 指標、slice、map、chan等都是引用型別。
new和make的區別
make 用來建立map、slice、channel new 用來建立值型別
new 和 make 均是用於分配記憶體:
new 用於值型別和使用者定義的型別,如自定義結構,make 用於內建引用型別(切片、map 和管道)。它們的用法就像是函式,但是將型別作為引數:new(type)、make(type)。new(T) 分配型別 T 的零值並返回其地址,也就是指向型別 T 的指標。它也可以被用於基本型別:v := new(int)。
make(T) 返回型別 T 的初始化之後的值,因此它比 new 進行更多的工作。new() 是一個函式,不要忘記它的括號。