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 的内容
与第一种操作的区别在于,
预期不符合的原因
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:]...)