Go中的make
函数用于创建和初始化切片(slice
)、映射(map
)、以及通道(channel
)。
创建切片,必须指定长度,但容量可以省略,当容量被缺省时,容量等于长度,例如,
mySilce := make([]int, 5) fmt.Println(len(mySilce), cap(mySilce)) // 输出:5 5
另外,当对切片进行插入操作导致,切片的长度超过容量,将会触发切片扩容, 当切片的容量小于1000时,新的切片会翻倍,当切片的容量大于1000时,通常会平缓的扩容(不同版本的go有不同的处理方式)。这也导致了,扩容带来的效率问题,因为每次扩容都需要将旧的切片中的所有元素复制到新的切片中。
创建
map
当使用make
创建一个映射时,你可以选择性地指定初始容量。即使未指定容量,映射也会被正确初始化,能够正常使用。myMap := make(map[string]string) fmt.Println(len(myMap)) // 输出:0
注意:
map
没有cap
这个接口。
但是,
var m map[string]int
m["a"] = 1 //panic: assignment to entry in nil map
因为这里只是声明了一个map
变量,并未给他分配空间。
通道
在 Go 中,make 也可以用于创建通道。对于通道,你可以选择性地指定其缓冲区大小。如果未指定缓冲区大小,则通道将是无缓冲通道。ch := make(chan int) // 无缓冲通道 ch := make(chan int, cap) // 有缓冲通道,缓冲区大小为 cap
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。