所以我正在测试切片,并认为不会降低容量。但从我所看到的情况来看。有谁知道容量下降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
答案 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