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

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支持的数组,因为之前已经在该行中分配了新数组。

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

最佳答案

您已经知道答案了。

  • 是依赖于实现的
  • 如果您要更改基础数组/slice
  • ,则将 slice 分片为var是一种不好的做法
  • 最好在需要时显式使用子 slice -这很便宜。

  • 很好的问题。感谢分享。

    关于memory-management - 在保持 slice 的同时生长 slice ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37302419/

    10-15 23:57