为什么 slice 的容量不会随着 `[:0]` 减少

why the slice's capacity does not decrease with `[:0]`

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

s = s[:0]

执行此操作后,slen()变为0,而cap()则没有。为什么容量没有减少?什么时候要用这个 'feature'?

选择不修改容量可能是一种性能优化。切片基本上是 'dynamic arrays',它们旨在提供数组容量无限的抽象。实际上,容量当然受到系统内存的限制,但是如果一个切片达到容量并且你 append 一个项目给它,Go 将为数组分配新内存以提供该容量(假设它可用,如果它是不是你的应用程序会恐慌)。

长度表示切片中实际可索引项的数量,而容量表示有多少底层内存。当您执行这些重新切片操作时,不需要立即释放内存,因此它仍保持已分配状态,这就是切片容量保持不变但长度变为零的原因。

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

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

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

s = s[:0:0]

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