我一直在尝试切片。这是一个示例程序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]
),因为这是完全相同的。
慕标琳琳
TA贡献1830条经验 获得超9个赞
你已经知道答案了。
它依赖于实现
如果要更改底层数组/切片,则将切片子切片为 var 是不好的做法
您最好在需要时明确使用子切片 - 它很便宜。
不过是个好问题。感谢分享。
- 2 回答
- 0 关注
- 124 浏览
添加回答
举报
0/150
提交
取消