为什么切片的容量不会随着“[:0]”而减少

时间:2016-11-04 20:42:47

标签: go slice

我正在阅读A Tour of Go并对切片案件感到困惑

s = s[:0]

执行此操作后,len()的{​​{1}}变为0,但s不变为cap()。为什么容量没有下降?什么时候想要使用这个“功能”?

2 个答案:

答案 0 :(得分:4)

您实际上可以使用三索引切片来获取零上限切片:

s = s[:0:0]

游乐场:https://play.golang.org/p/YetCdJVWrB

答案 1 :(得分:3)

不修改容量的选择可能是性能优化。切片基本上是“动态数组”,它们打算提供数组容量无限的抽象。实际上,容量当然受系统内存的限制,但是如果切片处于容量并且你append一个项目,Go将为阵列分配新内存以提供该容量(假设它是可用的,如果它是不是你的应用程序会恐慌)。

长度表示切片中的实际可索引项目计数,而容量则表示存在多少底层内存。当你进行那些重复操作时,没有立即需要释放内存,因此它仍然被分配,这就是切片容量保持不变但长度变为零的原因。

总的来说,这可能会带来更好的应用程序性能,因为如果后续语句将项目附加到切片,则内存仍然可用。在实践中,您通常不需要担心容量。我建议你把它放在脑海中。

最相关的时间,imo,就是当你从某些来源读取数据并且你知道这些数据的大小,或者至少有一个粗略的想法,并且你把它放在一个切片中。在这种情况下,如果使用适当的容量初始化切片,则应用程序的性能会更好。如果您没有提供长度或容量参数(如果只提供长度,则默认为长度),那么您可能会发现默认的切片增长效率相当低,或者至少会引入非常容易避免的低效率。