1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

[Go] slices パッケージ

Last updated at Posted at 2025-03-03

slices パッケージが Go 1.21 から標準パッケージになったため、よく使うものをまとめておく。

  • 実験結果からわかった、公式ドキュメントの説明では語られていなかった挙動も含めて
  • 個人的に samber/lo を使うことが多かったため、どの関数に対応するものなのかも
slices 説明 破壊的/非破壊的 samber/lo サンプルコード
Contains 指定した要素が存在するかを返す。 非破壊的 Contains サンプル
ContainsFunc 指定した関数の返り値が true になる要素が存在するかを返す。 非破壊的 ContainsBy サンプル
Index 指定した要素を検索し、見つかった最初の要素のインデックス値を返す。見つからなかった場合 -1 を返す。 非破壊的 IndexOf サンプル
IndexFunc 指定した関数の返り値が true になる要素を検索し、見つかった最初の要素のインデックス値を返す。見つからなかった場合、-1 を返す。 非破壊的 FindIndexOf サンプル
該当ナシ 指定した関数の返り値が true になる要素を検索し、見つかった最初の要素の値と、true を返す。見つからなかった場合、ゼロ値と false を返す。 非破壊的 Find
該当ナシ 指定した関数の返り値が true になる要素を検索し、見つかった最初の要素の値、インデックス値とtrue を返す。見つからなかった場合、ゼロ値、-1、false を返す。 非破壊的 FindIndexOf
Compact 連続する同じ値の要素をユニークにしたスライスを返す。

※注意
 - 元のスライスは破壊的に変更され、ユニークにされた分の要素はゼロで埋められる(= おそらく元のスライスに使い道はない)
 - この関数で期待する結果を得るには、先にソートされている必要がある。
破壊的 Uniq ※こちらはソート不要。また、同名の Compact という関数があるが、これはゼロ値の要素を削除するというものだった。 サンプル
CompactFunc 指定の連続する 2 つの要素を比較する関数 func(a, b) で true を返す場合、それら要素をユニークにしたスライスを返す。

※注意
 - 元のスライスは破壊的に変更され、ユニークにされた分の要素はゼロで埋められる(= おそらく元のスライスに使い道はない)
 - この関数で期待する結果を得るには、先にソートされている必要がある
UniqBy ※こちらは、指定する関数の形が func(i int) int であり、返り値が同じである要素がユニークになる。ソート不要。 サンプル
Reverse 指定したスライスの要素の順番を逆にする。 破壊的 Reverse (破壊的) サンプル
Sort 指定したスライスを昇順にソートする。 破壊的 該当ナシ サンプル
SortFunc スライスを、指定した関数 func(a, b <要素の形>) intでソートする。

・昇順ソートの場合: a < b で -1, a > b で 1 を返すようにする
・降順ソートの場合: a > b で 1, a < b で -1 を返すようにする

これは、a < b で -1, a > b で 1 を返してくれるという仕様が一致するc cmp.Compare(a, b) と相性がよく、よくサンプルでも組み合わせたものを見かける。
破壊的 該当ナシ サンプル
Max スライス内の最大値を返す。 非破壊的 Max サンプル
MaxFunc 指定した関数 func(a, b <要素の型>) int が昇順にソートさせるようなものである場合、スライスの最大値を返す。
・昇順ソートの場合: a < b で -1, a > b で 1 を返すようにする
・降順ソートの場合: a > b で 1, a < b で -1 を返すようにする

これは、a < b で -1, a > b で 1 を返してくれるという仕様が一致する cmp.Compare(a, b) と相性がよく、よくサンプルでも組み合わせたものを見かける。
非破壊的 MaxBy ※こちらは指定する関数の形が func(item xxx, max xxx) bool であり、最後に true を返した要素を返すというもの。 サンプル
Min スライス内の最小値を返す。 非破壊的 Min サンプル
MinFunc 指定した関数 func(a, b <要素の型>) int が昇順にソートさせるようなものである場合、スライスの最小値を返す。 非破壊的 MinBy ※こちらは指定する関数の形が func(item xxx, min xxx) bool であり、最後に true を返した要素を返すというもの。 サンプル

所感

sort.Slices でのソートに慣れていると、SortFunc(および MaxFunc、MinFunc) のクセ強感がすごい。
多くの場合 slices.SortFunc を使った方が高速らしいので慣れないと…。
cmp.Compare と併用することで、だいぶ違和感は低減できる。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?