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])

}

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

30
4
8
4
11
10
11
110
110
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。