Golang のスライスから要素を削除する方法
Go では、slice
は配列の時点でインデックスが作成される可変サイズの配列ですが、サイズを変更できるため、サイズは固定されていません。slice
の要素は動的な性質があるため、slice
から削除できます。Go に組み込みの関数がないため、slice
から要素を削除することは、他の言語とはかなり異なります。slice
から要素を削除するためです。
特定のスライスからサブスライスを作成する
slice
から要素を削除する詳細に入る前に、slice
から要素を削除するための主要コンポーネントの 1つであるため、特定の slice
から subslice
を作成する方法を説明します。
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 のスライスから要素を削除する
Go のスライスから要素を削除するタスクは、要件に基づいてさまざまな方法で実行できます。slice
から要素を削除するさまざまな方法を以下で説明します。
順序が重要な場合
要素を削除した後もスライスの順序を維持したい場合は、削除した要素の右側にあるすべての要素の位置を 1つ左にシフトします。
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]
ここで、slice2
は、slice1
からインデックス 2
の要素を削除した後に形成されます。
順序が重要ではない場合
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]
ここで、slice2
は、slice1
からインデックス 2
の要素を削除した後に形成されますが、要素の順序はここでは保持されません。以前の方法よりも高速です。
したがって、順序が速度よりも優先度が高い場合は最初の方法を使用し、速度が順序よりも優先度が高い場合は 2 番目の方法を使用して要素をスライスから削除します。
Suraj Joshi is a backend software engineer at Matrice.ai.
LinkedIn