如何从 Go 中的切片 Slice 中删除元素
Suraj Joshi
2023年1月30日
在 Go 中,切片是一个可变大小的数组,具有从数组开始的索引,但是其大小不是固定的,因为可以调整大小。切片中的任何元素都可以由于其动态性质而从切片中删除。从切片中删除元素与其他语言完全不同,这是因为 Go 中缺少内置功能来从切片中删除元素。
从给定切片创建子切片
在深入研究从切片中删除元素之前,我们将首先从给定的切片中创建子切片,因为它是从切片中删除元素的主要组成部分之一。
package main
import "fmt"
func main() {
var Slice1 = []int{1, 2, 3, 4}
fmt.Printf("slice1: %v\n", Slice1)
Slice2 := Slice1[:2]
fmt.Printf("slice2: %v\n", Slice2)
}
输出:
slice1: [1 2 3 4]
slice2: [1 2]
这里,slice2
是由 slice1
形成的子切片,其包含从开始-即索引 0
,到索引 2-1
即 1
的所有元素。请注意,Go 中的 slice
索引从 0
开始。
package main
import "fmt"
func main() {
var Slice1 = []int{1, 2, 3, 4}
fmt.Printf("slice1: %v\n", Slice1)
Slice2 := Slice1[2:]
fmt.Printf("slice2: %v\n", Slice2)
}
输出:
slice1: [1 2 3 4]
slice2: [3 4]
这里,slice2
是由 slice1
组成的子切片,其中包含从索引 2
到切片末尾的所有元素。
在 Go 中从切片中删除元素
根据我们的要求,可以通过不同的方法来完成从切片中删除元素的任务。下面讨论了从 slice
中删除元素的各种方法:
当排序重要时
如果我们希望在删除元素后保持切片的顺序,则将已删除元素右侧的所有元素的位置向左移动一个。
package main
import "fmt"
func remove(slice []int, s int) []int {
return append(slice[:s], slice[s+1:]...)
}
func main() {
var Slice1 = []int{1, 2, 3, 4, 5}
fmt.Printf("slice1: %v\n", Slice1)
Slice2 := remove(Slice1, 2)
fmt.Printf("slice2: %v\n", Slice2)
}
输出:
slice1: [1 2 3 4 5]
slice2: [1 2 4 5]
在此,从 slice1
中删除索引 2
中的元素后,形成 slice2
。
当顺序不重要时
package main
import "fmt"
func remove(s []int, i int) []int {
s[i] = s[len(s)-1]
return s[:len(s)-1]
}
func main() {
var Slice1 = []int{1, 2, 3, 4, 5}
fmt.Printf("slice1: %v\n", Slice1)
Slice2 := remove(Slice1, 2)
fmt.Printf("slice2: %v\n", Slice2)
}
输出:
slice1: [1 2 3 4 5]
slice2: [1 2 5 4]
在这里,从 slice1
中删除索引 2
处的元素后,形成了 slice2
,但此处未保留元素的顺序。它比以前的方法快。
因此,当顺序的优先级高于速度时,我们使用第一种方法,如果速度的优先级高于顺序,则使用第二种方法从切片中删除元素。
作者: Suraj Joshi
Suraj Joshi is a backend software engineer at Matrice.ai.
LinkedIn