为了账号安全,请及时绑定邮箱和手机立即绑定

在保留其子切片的同时生长切片

在保留其子切片的同时生长切片

Go
开心每一天1111 2022-01-10 17:07:58
我一直在尝试切片。这是一个示例程序for n := 1; n <= 10; n++ {    a := make([]int, 0)    for j := 0; j < n; j++ {        a = append(a, 0)    }    b := a[:1]    a = append(a, 0)    a[0] = 1    fmt.Println(n, b[0])}输出是1 02 03 14 05 16 17 18 09 110 1我明白这里发生了什么。a = append(a, 0)如果旧数组的长度不足,则该行分配一个新数组,并且新数组的长度是原始数组的两倍。因此,如果n是 2 的幂,则这条线a[0] = 1不会更改所支持的数组,b因为新数组将在之前的行中分配。但是,我在文档中找不到明确声明新分配的数组始终具有两倍的长度。这是否意味着我的代码依赖于实现?以这种方式将另一个切片的切片存储在变量中是不好的做法,还是应该a[j:k]每次需要子切片时都这样做?
查看完整描述

2 回答

?
慕码人2483693

TA贡献1860条经验 获得超9个赞

底层数组的大小加倍是一个实现细节(在当前实现中,一旦大小达到某个阈值,就不再是这样了)。所以你不能依靠这个来选择性地改变b[0]或不改变。

不幸的是,我不明白你的最后两个问题。分片没有任何问题,它不依赖于显式 ( a[i:k]) 或隐式开始或停止索引 (a[i:]a[:k]),因为这是完全相同的。


查看完整回答
反对 回复 2022-01-10
?
慕标琳琳

TA贡献1830条经验 获得超9个赞

你已经知道答案了。

  • 它依赖于实现

  • 如果要更改底层数组/切片,则将切片子切片为 var 是不好的做法

  • 您最好在需要时明确使用子切片 - 它很便宜。

不过是个好问题。感谢分享。


查看完整回答
反对 回复 2022-01-10
  • 2 回答
  • 0 关注
  • 124 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信