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

我一直在尝试切片。这是一个示例程序


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 0

2 0

3 1

4 0

5 1

6 1

7 1

8 0

9 1

10 1

我明白这里发生了什么。a = append(a, 0)如果旧数组的长度不足,则该行分配一个新数组,并且新数组的长度是原始数组的两倍。因此,如果n是 2 的幂,则这条线


a[0] = 1

不会更改所支持的数组,b因为新数组将在之前的行中分配。


但是,我在文档中找不到明确声明新分配的数组始终具有两倍的长度。这是否意味着我的代码依赖于实现?以这种方式将另一个切片的切片存储在变量中是不好的做法,还是应该a[j:k]每次需要子切片时都这样做?


开心每一天1111
浏览 125回答 2
2回答

慕码人2483693

底层数组的大小加倍是一个实现细节(在当前实现中,一旦大小达到某个阈值,就不再是这样了)。所以你不能依靠这个来选择性地改变b[0]或不改变。不幸的是,我不明白你的最后两个问题。分片没有任何问题,它不依赖于显式 (&nbsp;a[i:k]) 或隐式开始或停止索引 (a[i:]或a[:k]),因为这是完全相同的。

慕标琳琳

你已经知道答案了。它依赖于实现如果要更改底层数组/切片,则将切片子切片为 var 是不好的做法您最好在需要时明确使用子切片 - 它很便宜。不过是个好问题。感谢分享。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go