这两者之间有什么不同:
x := make([]int, 5, 10)
x := make([]int, 5)
x := [5]int{}
我知道
make
会分配一个数组并返回一个指向该数组的切片。但我不明白它可以在哪里使用?我找不到一个好的例子来阐明这个情况。
这两者之间有什么不同:
x := make([]int, 5, 10)
x := make([]int, 5)
x := [5]int{}
make
会分配一个数组并返回一个指向该数组的切片。但我不明白它可以在哪里使用?x := make([]int, 5)
创建一个长度和容量都为5的切片,其中元素类型为int
。
x := make([]int, 5, 10)
创建一个长度为5、容量为10的切片,其中元素类型为int
。
x := [5]int{}
创建一个长度为5的数组,其中元素类型为int
。
如果你需要使用append
函数添加的元素数量超过了切片的容量,Go运行时将会分配新的底层数组并将现有的复制到其中。因此,如果你知道你的切片的预估长度,最好使用显式的容量声明。这将在开始时消耗更多的底层数组内存,但可以为许多分配和数组复制节省CPU时间。
你可以使用在Go playground上的简单测试来探索len
和cap
在append
时如何变化。
每次cap
值改变时,都会分配新的数组。
数组的大小是固定的,因此如果你需要增加数组的大小,你必须创建一个新的长度并将旧的数组复制到其中。
关于切片和数组的一些很棒的文章:
http://blog.golang.org/go-slices-usage-and-internals
http://blog.golang.org/slices