😺

goのslicesのメソッド一覧

2024/12/22に公開

この記事はGo Advent Calendar 2024の23日目の記事です。

goでsliceやイテレータを扱うときに手癖でslicesにある物を書いてしまったりすることは無いでしょうか。ここ最近のバージョンで出てきたので意識して切り替えていかないとついやってしまいがちかと思います。そこでslicesの基本的なメソッド一覧(返される値付)を1枚のページに出してみました。(ちゃんとやるには本家のドキュメントとコード観ながらサンプル実行するのおすすめです)

*Func系は省いてあります

個人的に覚えておくと便利なメソッドはConcat、Containes、Equal、Reverse、Sort、Max、Minなどです。

All: スライス内のインデックスと値のペアをイテレータとして返します

iter := slices.All([]int{1, 2, 3})
for i, v := range iter {
    fmt.Println(i, v)
}
/*
   0 1
   1 2
   2 3
*/

AppendSeq: イテレータの値をスライスに追加し、拡張スライスを返します

s := []int{4, 5, 6}
iter := func(yield func(int) bool) {
    for _, v := range []int{1, 2, 3} {
        if !yield(v) {
            return
        }
    }
}
fmt.Println(slices.AppendSeq(s, iter))
[4 5 6 1 2 3]

Backward: スライス内のインデックスと値のペアをインデックスが降順になるように逆方向に走査するイテレータを返します

iter := slices.Backward([]int{1, 2, 3})

for i, v := range iter {
    fmt.Println(i, v)
}
2 3
1 2
0 1

BinarySearch: ソートされたスライスからターゲットを探しターゲットが見つかった最も古い位置あるいはソート順でターゲットが現れる位置を返します

n, found := slices.BinarySearch([]int{1, 2, 3}, 2)
fmt.Println(n, found)
1 true

Chunk: スライスの最大n要素までの連続したサブスライスに対するイテレータを返します

s := []int{1, 2, 3, 4, 5, 6}
iter := slices.Chunk(s, 2)
for v := range iter {
    fmt.Println(v)
}
[1 2]
[3 4]
[5 6]

Clip: クリップはスライスから未使用の容量を取り除きs[:len(s):len(s)]を返します

s := make([]int, 2, 10)
s[0] = 1
s[0] = 2
fmt.Printf("len:%d,cap:%d\n", len(s), cap(s))

s2 := slices.Clip(s)
fmt.Printf("len:%d,cap:%d\n", len(s2), cap(s2))
len:2,cap:10
len:2,cap:2

Clone: クローンはスライスのコピーを返します

s := []int{1, 2, 3}
fmt.Println(s)
clone := slices.Clone(s)
clone[0] = 0
// cloneされた物をいじっているので元のスライスは変化しない
fmt.Println(s)
[1 2 3]
[1 2 3]

Collect: イテレータを新しいスライスに集めて返す

iter := func(yield func(int) bool) {
    for _, v := range []int{1, 2, 3} {
        if !yield(v) {
            return
        }
    }
}

fmt.Println(slices.Collect(iter))
[1 2 3]

Compact: 同じエレメントの連続した値を1つのコピーに置き換える

s := []int{1, 1, 2, 3, 3}
fmt.Printf("before:%v\n", s)
fmt.Println(slices.Compact(s))
before:[1 1 2 3 3]
[1 2 3]

Compare: 引数のスライス要素を比較します各要素のペアに対して cmp.Compare を使用して一致する場合は0が返る

  • 返る値に関してはこちらを確認のこと
s1 := []int{1, 2, 3, 4, 5}
s2 := []int{1, 2, 3, 4}
fmt.Println(slices.Compare(s1, s2))
1

Concat: 渡されたスライスを連結した新しいスライスを返します

s := []int{1, 2, 3}
fmt.Println(slices.Concat(s, []int{4, 5, 6}))
[1 2 3 4 5 6]

Contains: 値がスライスに存在するかどうかを報告する

s := []int{1, 2, 3}
fmt.Println(slices.Contains(s, 1))
true

Delete: 要素s[i:j]を削除し、変更されたスライスを返す

s := []int{1, 2, 3}
fmt.Println(slices.Delete(s, 0, 1))
[2 3]

Equal: 2つのスライスが等しいかどうかを報告します

s1 := []int{1, 2, 3}
s2 := []int{1, 2, 3}
fmt.Println(slices.Equal(s1, s2))
true

Grow: 必要に応じてスライスの容量を増やしさらにn個の要素のためのスペースを保証する

s := []int{1, 2, 3}
fmt.Printf("before: len:%d,cap:%d\n", len(s), cap(s))
s = slices.Grow(s, 10)
fmt.Printf("after: len:%d,cap:%d\n", len(s), cap(s))
before: len:3,cap:3
after: len:3,cap:14

Index: 値が最初に現れるIndexを返す

s := []int{1, 2, 2, 3}
fmt.Println(slices.Index(s, 2))
1

Insert: インデックスに値を挿入し変更されたスライスを返す

s := []int{1, 2, 3}
fmt.Println(slices.Insert(s, 0, 0))
[0 1 2 3]

IsSorted: 順にソートされているかどうかを報告する

s := []int{3, 2, 1}
fmt.Println(slices.IsSorted(s))
false

Max: 最大値を返す

s := []int{1, 2, 3}
fmt.Println(slices.Max(s))
3

Min: 最小値を返す

s := []int{1, 2, 3}
fmt.Println(slices.Min(s))
1

Repeat: 指定されたスライスを指定された回数だけ繰り返す新しいスライスを返します

s := []int{1, 2, 3}
fmt.Println(slices.Repeat(s, 3))
[1 2 3 1 2 3 1 2 3]

Replace: 要素s[i:j]を与えられた値で置き換え変更されたスライスを返します

s := []int{1, 2, 3}
s = slices.Replace(s, 0, 1, 0)
fmt.Println(s)
[0 2 3]

Reverse: スライスの要素を反転させる

s := []int{1, 2, 3}
slices.Reverse(s)
fmt.Println(s)
[3 2 1]

Sort: 任意の順序型のスライスを昇順に並べ替えます

s := []int{3, 2, 1}
slices.Sort(s)
fmt.Println(s)
[1 2 3]

Sorted: イテレータから値を集めてソートする

iter := func(yield func(int) bool) {
    for _, v := range []int{3, 2, 1} {
        if !yield(v) {
            return
        }
    }
}
fmt.Println(slices.Sorted(iter))
[1 2 3]

Vlues: スライス要素を順番に返すイテレータを返す

s := []int{1, 2, 3}
iter := slices.Values(s)

for v := range iter {
    fmt.Println(v)
}
1
2
3

Discussion