golang中apend_golang的append()为什么不会影响slice的地址?

了解了 slice 的结构后,你就明白了。先来看看 slice 在源码中的结构,如下:

// runtime/slice.go

type slice struct {

array unsafe.Pointer // 数组指针

len int // 长度

cap int // 容量

}

slice,即切片,它主要包含三个信息,切片的开始位置(数组的地址),切片大小以及底层数组容量。

正因为切片的底层结构是数组,所以就可以直接基于数组创建切片,比如:

a := [...]int{0, 1, 2, 3, 4, 5, 6, 7}

s := a[1:6]

此时的切片结构是这样的,图示如下:

访问切片 s[0] 其实就是访问的 a[1] 位置,其实可以改变一下 s[0] 的值,就会发现 a[1] 的值也跟着改变了。

s[0] = 10

fmt.Println(a[1])

输出的结果是 10。

切片的长度和底层结构的容量分别可以通过 len 和 cap 获得。

fmt.Println(len(s)) // 6

fmt.Println(cap(s)) // 8

如果底层结构的数组容量足够,改变 slice 的 len 即可,slice 地址不会该干。

如果底层结构的数组容量不够,Go 会自动帮助创建新的数组,并将 s 指向新创建的数组,但是同样,slice 本身的地址并没有改变,只是改变了地址中的内容。

扩容基本是按需要的 2 倍容量申请,可以通过如下代码测试下,不断进行翻倍追加。

for i := 0; i < 10; i++ {

fmt.Println(cap(s))

s = append(s, s...)

}

终于完成连续 90 天答题成就,以后可以认真写回答了,不用再担心每天必须答一个问题了。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值