はじめに
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
文の中で上記の型と同じパターンで追加してもらえると対応できるかと思います。
- 他の型は、
- sliseで渡せる型は、
返り値
- 第一返り値は、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お待ちしております!