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])
}
看代碼猜結(jié)果。
切片是一個(gè)很小的對(duì)象,是對(duì)數(shù)組進(jìn)行了抽象,并提供相關(guān)的操作方法。切片有三個(gè)屬性字段:長(zhǎng)度、容量和指向數(shù)組的指針。
切片擴(kuò)容的兩條規(guī)則:
如果切片的容量小于1024個(gè)元素,那么擴(kuò)容的時(shí)候slice的cap就翻番,乘以2;一旦元素個(gè)數(shù)超過(guò)1024個(gè)元素,增長(zhǎng)因子就變成1.25,即每次增加原來(lái)容量的四分之一。舊版本為每次三分之一。
如果擴(kuò)容之后,還沒有觸及原數(shù)組的容量,那么,切片中的指針指向的位置,就還是原數(shù)組,如果擴(kuò)容之后,超過(guò)了原數(shù)組的容量,那么,Go就會(huì)開辟一塊新的內(nèi)存,把原來(lái)的值拷貝過(guò)來(lái),這種情況絲毫不會(huì)影響到原數(shù)組。
答案是
30
4
8
4
11
10
11
110
110