👀

【Go】指定した値がスライスに含まれているかチェックしたい

に公開

はじめに

現在携わっているプロジェクトで、指定した値がスライスに含まれているかチェックするロジックを実装しました。
forループで指定した値と一致するかチェックすればいいかと思っていましたが、もっと簡単に実装することができたので、今回はその方法を備忘録的に書いていきます!

この記事でわかること

  • forループを使った実装方法
  • slicesパッケージのContainsメソッドの使い方
  • 条件式で柔軟にチェックできる slices.ContainsFuncメソッドの使い方

forループで指定した値と一致するかチェック

「はじめに」でも書きましたが、最初は指定した値がスライスに含まれているかチェックするために、forループで一つ一つ値を見ていく必要がありそうと考えました。

例えば、以下のように実装することができます。

main.go
package main

import (
    "fmt"
)

func main() {
    nums := []int{1, 2, 3}
    for _, num := range nums {
        if num == 2 {
            fmt.Println("スライス内に「2」が存在します。")
        }
    }
}

実行すると、以下のような出力結果を得ることができます。

ターミナル
# go run main.go

スライス内に「2」が存在します。

もちろんこのような実装でも問題ないですが、より簡単に書くこともできるので次で紹介します。

slicesパッケージのContainsメソッド

タイトルにもあるとおり、slicesパッケージのContainsメソッドを使うことでより簡単に実装することができます。
slicesはGo 1.21で追加されたパッケージになります。

main.go
package main

import (
    "fmt"
    "slices"
)

func main() {
    nums := []int{1, 2, 3}
    if slices.Contains(nums, 2) {
        fmt.Println("スライス内に「2」が存在します。")
	}
}

実行すると、以下のような出力結果を得ることができます。

ターミナル
# go run main.go

スライス内に「2」が存在します。

slicesパッケージのContainsFuncメソッド

ちなみに、slicesパッケージのContainsFuncメソッドを使うことで、条件(関数)に一致する要素があるかを判定することができるので、合わせて紹介します。

main.go
package main

import (
    "fmt"
    "slices"
)

func main() {
    nums := []int{1, 2, 3}
    if slices.ContainsFunc(nums, func(n int) bool {
        return n%2 == 0
    }) {
        fmt.Println("偶数が含まれています。")
    }
}

実行すると、以下のような出力結果を得ることができます。

ターミナル
# go run main.go

偶数が含まれています。

まとめ

今回は、slicesパッケージのContainsメソッドを使うことで、指定した値がスライス内に含まれているかをチェックできることを紹介しました!

Go 1.21以降では、slicesが標準パッケージとして追加されているため、forループで手書きするよりもシンプルで意図が伝わりやすいコードを書くことができます。

また、ContainsFuncメソッドを使えば、特定条件に一致する要素があるかまで表現できるため、より柔軟な判定処理を簡単に実装できます。
スライス内のチェック処理を書く機会があれば、ぜひ積極的に活用してみてください!

参考

Discussion