go如何删除切片内元素
目录
方案一:重新分配新切片
常用、保持元素顺序、数据量大性能差
// 删除索引i处的元素(保持剩余元素顺序)
func removeOrdered(s []int, i int) []int {
arr:=make([]int,0,len(s)-1)
arr=apppen(arr,s[:i]...)
arr=apppen(arr,s[i+1:]...)
return arr
}
func main() {
s := []int{1, 2, 3, 4, 5}
s = removeOrdered(s, 2) // 删除索引2的元素(3)
fmt.Println(s) // [1 2 4 5]
}
方案二:快速删除
快速删除、不保持原顺序
// 快速删除(不保持顺序,但时间复杂度O(1))
func removeUnordered(s []int, i int) []int {
s[i] = s[len(s)-1] // 用最后一个元素覆盖要删除的元素
return s[:len(s)-1] // 截掉最后一个元素
}
func main() {
s := []int{1, 2, 3, 4, 5}
s = removeUnordered(s, 2) // 删除索引2的元素(3)
fmt.Println(s) // [1 2 5 4]
}
方案三:使用copy函数删除元素
func removeWithCopy(s []int, i int) []int {
copy(s[i:], s[i+1:])
return s[:len(s)-1]
}
func main() {
s := []int{1, 2, 3, 4, 5}
s = removeWithCopy(s, 2) // 删除索引2的元素(3)
fmt.Println(s) // [1 2 4 5]
}
泛型实现
func remove[T any](s []T, i int) []T {
arr:=make([]T,0,len(s)-1)
arr=apppen(arr,s[:i]...)
arr=apppen(arr,s[i+1:]...)
return arr
}
结论:
保持顺序:采用方案一
不保持顺序:采用方案二