
golang 切片裁剪后的变化:影响原切片
在 golang 中,切片操作会创建原始切片的视图,而不是创建新的切片。因此,当对视图进行修改时,也会影响原始切片。
第一种操作:不指定容量
a := t[:2] // 复制 t 前两个元素的视图,容量和 t 相同 b := t[2:] // 复制 t 中从索引 2 开始的视图,容量为视图中元素数量 a = append(a, 3) // 向 a 中追加元素,扩充了 a 和 t 的容量,并更改了 t 的内容
在这个操作中,a 和 t 共享相同的底层数组,因此a的更改也会影响t 。
立即学习“go语言免费学习笔记(深入)”;
第二种操作:指定容量
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:]...)










