尔游网
您的当前位置:首页go语言 切片的理解

go语言 切片的理解

来源:尔游网
func main(){

    s := []int{5}

    s = append(s,7)
    s = append(s,9)

    x := append(s,11)
    y := append(s,12)
    fmt.Prinln(s,x,y)
}

输出的结果是 [5,7,9] [5,7,9,12]  [5,7,9,12]

x和y 的值竟然一样了

把代码变一下

func main(){

    s := []int{5,7,9}


    x := append(s,11)
    y := append(s,12)
    fmt.Prinln(s,x,y)
}

输出的结果 [5,7,9] [5,7,9,11]  [5,7,9,12]

 

为什么会造成这样的结果呢,这个要从go 的  slice 原理说起

第一种情况:

1.创建 s时   cap1 len1  内存中数据为[5] s指针假设为p1

2.append(s,7)  按slice扩容机制 cps(s) 翻倍 cps=2  新建一个新的底层数组 此时 s指针指向新的数组 p2 底层数组元素 [5,7]

3,appen(s,9)  按slice扩容机制 cps(s)翻倍 cps=4   新建一个新的底层数组 将s指向的数组 复制到newarr 然后将 9 加到newarr 此时 s指向新数组 p3  数组元素为[5,7,9]

4,x:= append(s,11) 此时 容量足够不需要扩容 底层数组数据为[5,7,9,11] 此时 x 和  s 共同指向这个底层数组  p3

5,y := append(s,12)  此时cps(s)=4 容量足够不需要扩容  底层数组 第四个元素 用12 覆盖之前的11 s和y共同指向这个底层数组 数组元素为[5,7,9,12]

 

 

第二种情况:

1,s := []int{5,7,9}   cap(s) = 3 

所以 x,y 指向不同的数组 自然 值也就不一样了

因篇幅问题不能全部显示,请点此查看更多更全内容