1. 通过链式append 实现
将多个append
操作组合起来,实现在切片中间插入元素:
var a []int
a = append(a[:i], append([]int{1}, a[i:]...)...) // 在第i个位置插入1
a = append(a[:i], append([]int{1,2,3}, a[i:]...)...) // 在第i个位置插入切片
每个链式操作中的第二个append
调用都会创建一个临时切片,并将a[i:]
的内容复制到新创建的切片中,然后将临时创建的切片再追加到a[:i]
。
2. 通过copy + append 实现
通过 copy
和append
组合 可以避免创建中间的临时切片
a = append(a, 0) // 切片扩展1个空间
copy(a[i+1:], a[i:]) // a[i:]向后移动1个位置
a[i] = x // 设置新添加的元素
用copy
和append
组合在中间位置插入多个元素(也就是插入一个切片):
a = append(a, x...) // 为x切片扩展足够的空间
copy(a[i+len(x):], a[i:]) // a[i:]向后移动len(x)个位置
copy(a[i:], x) // 复制新添加的切片
注:append
本质是用于追加元素而不是扩展容量,扩展切片容量只是append
的一个副作用。
有趣有料有温度,和我一起学技术!
欢迎关注公众号 来思Go,收看更多赖克与甜甜的技术学习日常。