【发布时间】:2017-07-01 15:48:27
【问题描述】:
我已经阅读了this blog post。每一个解释都是那么清晰易懂。我明白了切片在容量增加时的作用。但我对这种行为的反面有疑问。当容量减少时,切片的行为如何?考虑这个例子:
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
我想知道这有什么意义?有没有像增加这样的容量计算公式的正确方法?
【问题讨论】: