Go 为什么切片会将容量减少1

Go 为什么切片会将容量减少1,go,slice,Go,Slice,所以我在测试片,认为go不会降低容量。但就我所见,它确实如此。有人知道1的容量下降的原因吗(go1.8 linux/amd64版) 将大小更改为1000会将输出更改为此值 1000 | 0 1000 | 1000 999 | 499 通过将代码更改为以下内容(从索引0开始),容量将保持不变,与预期一致。通过在切片中使用索引1,您丢失了第一个项目(0处的项目),这就是容量明显变化的原因 name2 := name[0:500] fmt.Printf("%d | %d\n", cap(na

所以我在测试片,认为go不会降低容量。但就我所见,它确实如此。有人知道1的容量下降的原因吗<代码>(go1.8 linux/amd64版)

将大小更改为1000会将输出更改为此值

1000 | 0
1000 | 1000
999 | 499

通过将代码更改为以下内容(从索引0开始),容量将保持不变,与预期一致。通过在切片中使用索引1,您丢失了第一个项目(0处的项目),这就是容量明显变化的原因

  name2 := name[0:500]
  fmt.Printf("%d | %d\n", cap(name2), len(name2))
产生产出:

100000000 | 500

通过将代码更改为以下内容(从索引0开始),容量将保持不变,与预期一致。通过在切片中使用索引1,您丢失了第一个项目(0处的项目),这就是容量明显变化的原因

  name2 := name[0:500]
  fmt.Printf("%d | %d\n", cap(name2), len(name2))
产生产出:

100000000 | 500

从左侧收缩切片(增加底层数组中切片的开始索引)时,会降低其容量,因为它永远无法向左增长。从右侧收缩切片(减少切片的长度)时,容量不变,因为切片可以向右增长。例如:

name := make([]int, 100)
fmt.Printf("%d | %d\n", cap(name), len(name))
name2 := name[:50]  // Won't shrink because left side is unchanged
fmt.Printf("%d | %d\n", cap(name2), len(name2))
name2 = name[50:]   // WILL shrink because left side is moved up
fmt.Printf("%d | %d\n", cap(name2), len(name2))
产出:

cap 100 | len 100
cap 100 | len 50
cap 50 | len 50

操场演示:

当您从左侧收缩一个切片(增加该切片在基础数组中的开始索引)时,您会减少其容量,因为它永远不会向左增长。从右侧收缩切片(减少切片的长度)时,容量不变,因为切片可以向右增长。例如:

name := make([]int, 100)
fmt.Printf("%d | %d\n", cap(name), len(name))
name2 := name[:50]  // Won't shrink because left side is unchanged
fmt.Printf("%d | %d\n", cap(name2), len(name2))
name2 = name[50:]   // WILL shrink because left side is moved up
fmt.Printf("%d | %d\n", cap(name2), len(name2))
产出:

cap 100 | len 100
cap 100 | len 50
cap 50 | len 50

操场演示:

索引从0开始索引从0开始完全有意义!谢谢,这是有道理的!谢谢