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]

所以 s, x, y 都指向了同一个内存地址

 

 

第二种情况:

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

2, x := append(s,11) 需要扩容  新建一个底层数组   x指向这个内存地址

3, y := append(s,12) 需要扩容  昔年一个底层数组  y指向这个内存地址

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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值