有什么区别:
x := make([]int, 5, 10)
x := make([]int, 5)
x := [5]int{}
我知道make
分配一个数组并返回一个引用该数组的切片。我不明白它可以在哪里使用?
我找不到一个能够澄清情况的好例子。
答案 0 :(得分:8)
x := make([]int, 5)
使int
的切片长度为5,容量为5(与长度相同)。
x := make([]int, 5, 10)
使int
的切片长度为5,容量为10。
x := [5]int{}
制作长度为5的int
数组。
如果您需要使用append
函数附加比 capacity 更多的项目,那么运行时将分配新的底层数组并将现有数据复制到其中。因此,如果您了解切片的估计长度,最好使用显式容量声明。它会在开始时为底层数组消耗更多内存,但是许多分配和数组复制的安全CPU时间
您可以使用 Go playground 上的简单测试,探索len
和cap
在append
时的变化情况
每次cap
值更改时,都会分配新数组
数组大小是固定的,因此如果您需要增长数组,则必须创建具有新长度的新数组,并将您自己的旧数组复制到其中。
在go中有一些关于切片和数组的精彩文章:
http://blog.golang.org/go-slices-usage-and-internals
http://blog.golang.org/slices
答案 1 :(得分:1)
第二行将在最开始时分配10个值得记忆的内存,但是返回5个int的片段。第二行不会占用更少的内存,如果需要将切片扩展到不超过10 * load_factor的任何内容,它会为您节省另一个内存分配。