內建函數 make 用來為 slice,map 或 chan 類型分配內存和初始化一個對象(注意:只能用在這三種類型上),跟 new 類似,第一個參數也是一個類型而不是一個值,跟 new 不同的是,make 返回類型的引用而不是指針,而返回值也依賴於具體傳入的類型
make()函數在golang的代碼如下:
func make(t Type,size IntegerType) Type
1
使用make來創建slice,map,chanel說明如下:
slice:
var slice_ []int = make([]int,5,10)
fmt.Println(slice_)
var slice_1 []int = make([]int,5)
fmt.Println(slice_1)
var slice_2 []int = []int{1,2}
fmt.Println(slice_2)
打印結果:
[0 0 0 0 0]
[0 0 0 0 0]
[1,2]
1
2
3
4
5
6
7
8
9
10
11
12
13
在創建slice時第一個參數用於確定初始化該slice的大小該slice中的值為零值,第三個參數用於確定該slice的長度
如果我們創建該slice時就能確定該slice最多只會裝多大的數據量時就可以使用第三個參數固定該slice的長度,這樣做的就會免去如果slice的數據超出內部所指向的array的最大長度時對array數據的轉移,可以提高效率
map:
var m_ map[string]int = make(map[string]int)
m_["one"] = 1
fmt.Println(m_)
var m map[string]int = map[string]int{"1":1}
m["2"] = 2
fmt.Println(m)
打印結果:
map[one:1]
map[1:1 2:2]
1
2
3
4
5
6
7
8
9
10
11
根據 size 大小來初始化分配內存,不過分配后的 map 長度為 0,如果 size 被忽略了,那么會在初始化分配內存時分配一個小尺寸的內存
chanel:
管道緩沖區依據緩沖區容量被初始化。如h果容量為 0 或者忽略容量,管道是沒有緩沖區的
make函數,該函數第一個參數是類型,第二個參數是分配的空間,第三個參數是預留分配空間,例如a:=make([]int, 5, 10), len(a)輸出結果是5,cap(a)輸出結果是10,然后我對a[4]進行賦值發現是可以得,但對a[5]進行賦值發現報錯了,於是郁悶這個預留分配的空間要怎么使用呢,於是google了一下發現原來預留的空間需要重新切片才可以使用,代碼如下。
package main
import "fmt"
func main(){
a := make([]int, 10, 20)
fmt.Printf("%d, %d\n", len(a), cap(a))
fmt.Println(a)
b := a[:cap(a)]
fmt.Println(b)
}
參考:
https://blog.csdn.net/happinessaflower/article/details/44659651
https://studygolang.com/articles/10751