Golang:Make函数和第三个参数

3

这两者之间有什么不同:

   x := make([]int, 5, 10)    
   x := make([]int, 5)   
   x := [5]int{}

我知道make会分配一个数组并返回一个指向该数组的切片。但我不明白它可以在哪里使用?
我找不到一个好的例子来阐明这个情况。
2个回答

8

x := make([]int, 5) 创建一个长度和容量都为5的切片,其中元素类型为int

x := make([]int, 5, 10) 创建一个长度为5、容量为10的切片,其中元素类型为int

x := [5]int{} 创建一个长度为5的数组,其中元素类型为int

切片

如果你需要使用append函数添加的元素数量超过了切片的容量,Go运行时将会分配新的底层数组并将现有的复制到其中。因此,如果你知道你的切片的预估长度,最好使用显式的容量声明。这将在开始时消耗更多的底层数组内存,但可以为许多分配和数组复制节省CPU时间。
你可以使用在Go playground上的简单测试来探索lencapappend时如何变化。
每次cap值改变时,都会分配新的数组。

数组

数组的大小是固定的,因此如果你需要增加数组的大小,你必须创建一个新的长度并将旧的数组复制到其中。

关于切片和数组的一些很棒的文章:
http://blog.golang.org/go-slices-usage-and-internals
http://blog.golang.org/slices


1
第二行代码会在一开始分配10个int的内存,但是会返回一个包含5个int的切片。第二行不会浪费内存,如果你需要扩展切片大小但不超过10 * load_factor, 它可以避免再次分配内存。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接