总结:
s := []int{1, 2, 3, 4, 5} 长度5 容量5
newS := s[a:b] 以s为基底生成切片时, 长度 b-a 容量 len(s)-a
当newS进行append后:
若容量不超 ,那么[]s也会跟着改变
若超了,则[]s不改变,[]newS可视为new出来的一个切片 且容量翻倍直至足够容纳新切片,当超过1000时,变为每次增长25%
代码示例
package main
import "fmt"
func main() {
}
// 切片基底数组变更
func slice1(){
//new一个长度5容量5的数组
slice := []int{10, 20, 30, 40, 50}
//切片生成新数组,这个数组的长度为3-1=2 容量为len(slice)-1 此处的1是切片开始的位置
newSlice := slice[1:3]
//进行append操作,append一次后长度变为3
newSlice = append(newSlice, 60)
//由于未超出容量4,因此会导致基底跟随变化
fmt.Printf("slice: %v\n", slice)
fmt.Printf("newSlice: %v\n", newSlice)
// output:
// slice: [10 20 30 60 50]
// newSlice: [20 30 60]
}
// 切片基底数组未变更
func slice2(){
//new一个长度5容量5的数组
slice := []int{10, 20, 30, 40, 50}
//切片生成新数组,这个数组的长度为3-1=2 容量为len(slice)-1 此处的1是切片开始的位置
newSlice := slice[1:3]
//进行append操作,append一次后长度变为5,但是之前容量只有4,因此容量翻倍变为8
newSlice = append(newSlice, 60,70,80)
//由于超出容量4,因此新切片可被视为new出来的,不会导致基底跟随变化
fmt.Printf("slice: %v\n", slice)
fmt.Printf("newSlice: %v\n", newSlice)
// output:
// slice: [10 20 30 40 50]
// newSlice: [20 30 60 70 80]
}
有疑问加站长微信联系(非本文作者))

https://golang.design/go-questions/slice/grow/
进行内存对齐之后,新 slice 的容量是要 大于等于 老 slice 容量的 2倍或者1.25倍。