Goのスライスから要素を削除する方法——Go 1.21以降はslices.Deleteが使える

Goのスライスから要素を削除する方法——Go 1.21以降はslices.Deleteが使える

2分で読める テック
最終更新:

Go言語でスライスから要素を削除する方法を整理します。Go 1.21以降はシンプルに書けるようになっています。

Go 1.21以降:slices.Delete(推奨)

Go 1.21で追加された標準ライブラリ slices パッケージの Delete 関数を使うのが現在の推奨です。

import "slices"

a := []int{1, 2, 3, 4, 5}

// インデックス2の要素(3)を削除
a = slices.Delete(a, 2, 3)  // 第2引数: 開始インデックス(含む), 第3引数: 終了インデックス(含まない)
// => [1 2 4 5]

slices.Delete(s, i, j)s[i:j] の範囲を削除します。1要素だけ削除するときは j = i + 1 にします。

Go 1.20以前:appendトリック

Go 1.20以前や slices パッケージを使わない場合は、appendcopy を組み合わせます。

a := []int{1, 2, 3, 4, 5}
i := 2  // 削除したいインデックス

// 元のスライスの順序を保持する
a = append(a[:i], a[i+1:]...)
// => [1 2 4 5]

順序を保持しなくてよい場合は末尾の要素と入れ替える方法が高速です。

a[i] = a[len(a)-1]
a = a[:len(a)-1]
// => [1 2 5 4] (順序が変わる)

値で指定して削除する

値でスライスから要素を削除するには slices.Indexslices.Delete を組み合わせます。

import "slices"

a := []int{1, 2, 3, 4, 5}

// 値3を削除
if i := slices.Index(a, 3); i != -1 {
    a = slices.Delete(a, i, i+1)
}
// => [1 2 4 5]

まとめ

Goバージョン推奨方法
1.21以降slices.Delete(s, i, i+1)
1.20以前append(a[:i], a[i+1:]...)

新規コードでは slices パッケージを使うと可読性が上がります。

参考

質問・リクエストを送る

記事についての質問や、取り上げてほしいテーマがあればお気軽にどうぞ。いただいた質問はブログ記事として回答し、Q&Aページで公開することがあります。