Golang 切片裁剪后修改会影响原切片吗?

golang 切片裁剪后修改会影响原切片吗?

golang 切片裁剪后的变化:影响原切片

golang 中,切片操作会创建原始切片的视图,而不是创建新的切片。因此,当对视图进行修改时,也会影响原始切片。

第一种操作:不指定容量

a := t[:2]       // 复制 t 前两个元素的视图,容量和 t 相同
b := t[2:]       // 复制 t 中从索引 2 开始的视图,容量为视图中元素数量
a = append(a, 3)  // 向 a 中追加元素,扩充了 a 和 t 的容量,并更改了 t 的内容

在这个操作中,a 和 t 共享相同的底层数组,因此a的更改也会影响t 。

第二种操作:指定容量

a := t[:2:2]    // 复制 t 前两个元素的视图,容量和 t 相同
b := t[2:]       // 复制 t 中从索引 2 开始的视图,容量为视图中元素数量
a = append(a, 3)  // 向 a 中追加元素,扩充了 a 和 t 的容量,并更改了 t 的内容

与第一种操作的区别在于, 指定了 a 的容量与 t 相同。在这种情况下,a 仍会影响 t,因为底层数组相同。

预期不符合的原因

t := []int{1, 2, 4, 5}
r := append(append(t[:2], 3), t[2:]...)

在这个操作中,append(t[:2], 3) 创建了一个容量为 3 的新切片,但随后将 t[2:] 追加到该切片时,由于容量不足导致底层数组扩容。同时,这也会影响到 t 的底层数组。因此,r 并不是预期的 [1 2 3 4 5]。

解决方案

若想要在切片中指定位置插入元素,可以使用以下方式:

t := []int{1, 2, 4, 5}
r := []int{}    // 创建一个空切片
r = append(r, t[:2]...)
r = append(r, 3)
r = append(r, t[2:]...)

以上就是Golang 切片裁剪后修改会影响原切片吗?的详细内容,更多请关注其它相关文章!