Golang のスライスから要素を削除する方法

Suraj Joshi 2023年1月30日
  1. 特定のスライスからサブスライスを作成する
  2. Go のスライスから要素を削除する
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]

ここで、slice2slice1 から形成されるサブスライスであり、最初からすべての要素、つまりインデックス 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]

ここで、slice2slice1 から形成されたサブスライスであり、インデックス 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
Suraj Joshi avatar Suraj Joshi avatar

Suraj Joshi is a backend software engineer at Matrice.ai.

LinkedIn

関連記事 - Go Slice