Go切片原理

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
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容