func main(){
arr := [4]int{10, 20, 30, 40}
slice := arr[0:2]
testSlice1 := slice
fmt.Println(arr[2])
testSlice2 := append(append(append(slice, 1),2),3)
testSlice3 := append(slice,110)
slice[0] = 11
fmt.Println(cap(testSlice1))
fmt.Println(cap(testSlice2))
fmt.Println(cap(testSlice3))
fmt.Println(testSlice1[0])
fmt.Println(testSlice2[0])
fmt.Println(testSlice3[0])
fmt.Println(testSlice3[2])
fmt.Println(arr[2])
}
看代码猜结果。
切片是一个很小的对象,是对数组进行了抽象,并提供相关的操作方法。切片有三个属性字段:长度、容量和指向数组的指针。
切片扩容的两条规则:
如果切片的容量小于1024个元素,那么扩容的时候slice的cap就翻番,乘以2;一旦元素个数超过1024个元素,增长因子就变成1.25,即每次增加原来容量的四分之一。旧版本为每次三分之一。
如果扩容之后,还没有触及原数组的容量,那么,切片中的指针指向的位置,就还是原数组,如果扩容之后,超过了原数组的容量,那么,Go就会开辟一块新的内存,把原来的值拷贝过来,这种情况丝毫不会影响到原数组。
答案是
30
4
8
4
11
10
11
110
110