如何從 Go 中的切片 Slice 中刪除元素
Suraj Joshi
2023年1月30日
2020年6月9日
在 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
,但此處未保留元素的順序。它比以前的方法快。
因此,當順序的優先順序高於速度時,我們使用第一種方法,如果速度的優先順序高於順序,則使用第二種方法從切片中刪除元素。
Author: Suraj Joshi
Suraj Joshi is a backend software engineer at Matrice.ai.
LinkedIn