[Go] slice内で特定の要素があるか調べる、contains関数を作ってみた(解説付)

はじめに

Golangの標準パッケージで、PHPやJavaScriptでいうところのcontain関数のようなものがなかったので、作ってみました。
気軽にコピペして使って頂けると嬉しいです。

サクッと動作確認

  • 実行ボタンを押すと、動作確認できます。
  • コードを書き換えて実行することも可能です。
  • 元のコードに戻したい場合は、このページをリロードして下さい。

今回のコード全文

package main
import (
    "fmt"
    "reflect"
)

func main(){
    list := []uint64{1, 2, 3} // ここに対象のスライスを入れる
    target := uint64(3)       // ここに対象の要素を入れる

    result, err := contains(target, list)
    fmt.Println(result, err) // -> true <nil>
}

func contains(target interface{}, list interface{}) (bool, error) {

    switch list.(type) {
        default:
            return false, fmt.Errorf("%v is an unsupported type", reflect.TypeOf(list))
        case []int:
            revert := list.([]int)
            for _, r := range revert {
                if target == r {
                    return true, nil
                }
            }
            return false, nil

        case []uint64:
            revert := list.([]uint64)
            for _, r := range revert {
                if target == r {
                    return true, nil
                }
            }
            return false, nil

        case []string:
            revert := list.([]string)
            for _, r := range revert {
                if target == r {
                    return true, nil
                }
            }
            return false, nil
    }

    return false, fmt.Errorf("processing failed")
}

関数の使い方

引数

  • 第一引数には、検索したい要素を渡して下さい。
  • 第二引数には、対象のsliceを渡して下さい。
    • sliseで渡せる型は、[]int[]uint64[]stringに対応しています。
      • 他の型は、case文の中で上記の型と同じパターンで追加してもらえると対応できるかと思います。

返り値

  • 第一返り値は、boolです。
    • 対象のsliceに対して、検索したい要素が存在すればtrue、なければfalseが返ります。
  • 第二返り値は、errorです。
    • エラーメッセージ: hoge is an unsupported type
      • 渡されたsliseの型が対応していないことを表します。
    • エラーメッセージ: processing failed
      • それ以外の予期しない理由で、処理に失敗したことを表します。

他の型も使いたい場合

  • 上記の通り、関数内のcase文で使いたい型のパターンを追記してもらえると対応できるかと思います。

関数のざっくり解説

  • 第二引数のsliceを、型判別する
  • []int[]uint64[]stringであれば、型アサーションでinterface型からそれぞれの型に戻します。
    • それ以外の型であれば、「その型に対応してません」といった旨のエラーを出します。
  • 第一引数のtargetと、型アサーションしたsliseをforで回しながら、1つずつ比較します。
    • 同じ要素があれば、その時点でtrueを返します。

さいごに

最後まで読んで頂き、ありがとうございました。
「もっとこうした方が良いよ」等のツッコミがあれば、twitter等でDMお待ちしております!

参考サイト

PON3

PON3

5年くらい前に、30代完全未経験から独学でWeb系のソフトウェアエンジニアになった人。 現在はフリーランスエンジニアとして、大阪の自宅からフルリモートで東京の自社開発企業のお仕事をしている。 主戦場はバックエンドで、Go言語でのAPI開発や、Pythonでのデータ分析が武器。 とは言いつつ、フロントエンドをSPAを実装したり、IaCでクラウドインフラの設計構築したり、スクラム開発でプロジェクト運営したりするなんでも屋。 いつも、ググってきては誰かが書いてくれた記事を見て開発していたが、もらってばかりでなく世の中に返すこともしたいと思い、技術ブログをはじめる。 妻と2歳になる娘の3人暮らし。 何かご用件がある方は、TwitterのDMからどうぞ。