Arrays 当片容量减少时,片的行为如何?

Arrays 当片容量减少时,片的行为如何?,arrays,go,slice,Arrays,Go,Slice,我已经读过了。每一个解释都是如此清晰易懂。我得到了一个要点,即当片容量增加时,片是如何工作的。但我对这种行为的反面有一个疑问。当片容量减少时,片的行为如何?考虑到这个例子: var numbers = [8]int{1, 11, 78, 81, 101, 344, 65, 13} fmt.Printf("len=%d, cap=%d\n", len(numbers), cap(numbers)) // len=8, cap=8 numbers2 := numbers[:4] fmt.Print

我已经读过了。每一个解释都是如此清晰易懂。我得到了一个要点,即当片容量增加时,片是如何工作的。但我对这种行为的反面有一个疑问。当片容量减少时,片的行为如何?考虑到这个例子:

var numbers = [8]int{1, 11, 78, 81, 101, 344, 65, 13}
fmt.Printf("len=%d, cap=%d\n", len(numbers), cap(numbers)) // len=8, cap=8

numbers2 := numbers[:4]
fmt.Printf("len=%d, cap=%d\n", len(numbers2), cap(numbers2)) // len=4, cap=8
对于
numbers2
来说,这是显而易见的。新创建的数组的容量将设置为新切片中元素数量的两倍。但考虑到这个例子,它的作用不同:

numbers3 := numbers[1:5]
fmt.Printf("len=%d, cap=%d\n", len(numbers3), cap(numbers3)) // len=4, cap=7

numbers4 := numbers[3:8]
fmt.Printf("len=%d, cap=%d\n", len(numbers4), cap(numbers4)) // len=5, cap=5

我想知道这有什么意义?有没有合适的容量计算公式,比如增加

中描述了切片规则

在您的示例中,
numbers
是一个。对数组进行切片时,结果切片的容量将是从结果切片的第一个元素到数组的最后一个元素的元素数。切片时,结果的容量是从第一个元素到原始切片容量的元素数

因此
numbers2:=numbers[:4]
,低索引被省略,因此默认为
0
,因此结果的容量将为
8-0=8
(数组的大小)

numbers3:=numbers[1:5]
中,结果的容量将为
7
,因为结果中的第一个元素位于索引
1
,因此
8-1=7

numbers4:=numbers[3:8]
中,容量将为
8-3=5

注意:这是在使用“简单”切片表达式时,即在切片表达式中仅提供2个索引(其形式为
a[low:high]
)。还有一个“完整”切片表达式,其形式为
a[low:high:max]
,它通过将结果切片设置为
max-low
来额外控制结果切片的容量

参见相关问题:


中介绍了切片规则

在您的示例中,
numbers
是一个。对数组进行切片时,结果切片的容量将是从结果切片的第一个元素到数组的最后一个元素的元素数。切片时,结果的容量是从第一个元素到原始切片容量的元素数

因此
numbers2:=numbers[:4]
,低索引被省略,因此默认为
0
,因此结果的容量将为
8-0=8
(数组的大小)

numbers3:=numbers[1:5]
中,结果的容量将为
7
,因为结果中的第一个元素位于索引
1
,因此
8-1=7

numbers4:=numbers[3:8]
中,容量将为
8-3=5

注意:这是在使用“简单”切片表达式时,即在切片表达式中仅提供2个索引(其形式为
a[low:high]
)。还有一个“完整”切片表达式,其形式为
a[low:high:max]
,它通过将结果切片设置为
max-low
来额外控制结果切片的容量

参见相关问题:


感谢您的解释和其他相关的现有问题。感谢您的解释和其他相关的现有问题。