我一直在尝试 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]
? 最佳答案
您已经知道答案了。
很好的问题。感谢分享。
关于memory-management - 在保持 slice 的同时生长 slice ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37302419/