为什么切片会将容量减少一

时间:2018-01-24 02:38:59

标签: go slice

所以我正在测试切片,并认为不会降低容量。但从我所看到的情况来看。有谁知道容量下降1的原因? (go version go1.8 linux/amd64)

package main

import "fmt"

func main() {
    name := make([]int, 0, 100000000)
    fmt.Printf("%d | %d\n", cap(name), len(name))
    for x:= 0; x < 1000; x++ {
        name = append(name, x)
    }
    fmt.Printf("%d | %d\n", cap(name), len(name))
    name2 := name[1:500]
    fmt.Printf("%d | %d\n", cap(name2), len(name2))
}

输出

100000000 | 0
100000000 | 1000
99999999 | 499

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

1000 | 0
1000 | 1000
999 | 499

2 个答案:

答案 0 :(得分:4)

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

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

制作输出:

100000000 | 500

答案 1 :(得分:2)

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

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

游乐场演示:https://play.golang.org/p/jbGRmexV5d-