ホーム プログラミング言語 golang golang container Go言語はスライスから要素を削除します

Go言語はスライスから要素を削除します

 
 
Go 言語にはスライス要素を削除するための専用の構文やインターフェイスが用意されていないため、スライス自体の特性を利用して要素を削除する必要があります。削除する要素の位置に応じて、先頭から削除する 3 つの状況があります。 、中央から削除し、最後から削除します。これにより、スライスの最後にある要素が最も速く削除されます。

 

最初から削除

先頭の要素を削除すると、データ ポインタを直接移動できます。

 a = []int{1, 2, 3}
a = a[1:] // 先頭の1つの要素を削除する
a = a[N:] // 先頭のN個の要素を削除する 

データポインタを移動させずに、次のデータを先頭に移動することも可能で、appendを使用してその場で完了させることもできます(いわゆるその場での完了とは、データポインタに対応するメモリ間隔で完了することを意味します)元のスライス データを保持し、メモリ空間構造に変更を引き起こしません):

 a = []int{1, 2, 3}
a = append(a[:0], a[1:]...) // 先頭1つを削除
a = append(a[:0], a[N:]...) // 先頭N個を削除 

copy() 関数を使用して最初の要素を削除することもできます。

 a = []int{1, 2, 3}
a = a[:copy(a, a[1:])] // 先頭の1つの要素を削除
a = a[:copy(a, a[N:])] // 先頭のN個の要素を削除 

途中から削除

中間の要素を削除するには、残りの要素を全体として移動する必要があります。これは、追加またはコピーを使用してその場で実行することもできます。

 a = []int{1, 2, 3, ...}
a = append(a[:i], a[i+1:]...) // 中間の1つの要素を削除する
a = append(a[:i], a[i+N:]...) // 中間のN個の要素を削除する
a = a[:i+copy(a[i:], a[i+1:])] // 中間の1つの要素を削除する
a = a[:i+copy(a[i:], a[i+N:])] // 中間のN個の要素を削除する 
端から取り除く
 a = []int{1, 2, 3}
a = a[:len(a)-1] // 末尾の要素を1つ削除
a = a[:len(a)-N] // 末尾の要素をN個削除 

先頭の要素を削除する場合も、末尾の要素を削除する場合も、中間要素の削除操作の特殊なケースと考えることができます。

【例】スライスの指定位置の要素を削除します。

package main

import "fmt"

func main() {
    seq:= []string{"a"、"b"、"c"、"d"、"e"}

    //削除する位置を指定する
    index:= 2

    //削除位置の前後にある要素を確認する
    fmt.Println(seq [: index]、seq [index + 1:])

    //削除点の前後の要素を接続する
    seq = append(seq [: index]、seq [index + 1:] ...)

    fmt.Println(seq)
} 

コード出力結果:

[a b] [d e]
[a b d e]

コードの説明は次のとおりです。

  • 1 行目では、a から e までの文字列を保持する整数スライスを宣言します。
  • 4 行目では、デモンストレーションと説明の便宜上、インデックス変数を使用して、削除する要素の位置を保存します。
  • 7 行目では、 seq[:index] は削除された要素の前半を表し、値は [1 2] 、 seq[index+1:] は削除された要素の後半を表し、値は [4 5] です。
  • 10 行目では、append() 関数を使用して 2 つのスライスが連結されています。
  • 12行目、接続された新しいスライスを出力します。この時点で、インデックス2の要素は削除されています。

コード削除プロセスは、次の図を使用して説明できます。

図:要素をスライスして削除する操作手順

Go言語におけるslice要素の削除の本質は、削除した要素を分割点として前後の部分の記憶をつなぎ直すことです。

ヒント

連続コンテナの要素削除は、どの言語においても削除点の前後の要素を新しい位置に移動する必要があり、要素数が増えると非常に時間がかかります。スライスから要素を削除するとき、パフォーマンス要件が高い場合は、他のコンテナ (削除ポイントから要素をすばやく削除できる二重リンク リストなど) を置き換えることを検討する必要があります。

 

「 Go言語はスライスから要素を削除します」についてわかりやすく解説!絶対に観るべきベスト2動画

【Go言語 超入門コース】06.変数 |変数は、例えるなら「箱」のこと。箱にデータを入れておくことができます【プログラミング初心者向け入門講座】
2-5 ファイルの削除(Gitの基本)