目录

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
}

结论:

保持顺序:采用方案一

不保持顺序:采用方案二