From fc8bb273c8d898a8a277c9389e80a982dc3d6d8b Mon Sep 17 00:00:00 2001 From: demoManito <1430482733@qq.com> Date: Thu, 8 Sep 2022 13:46:08 +0800 Subject: [PATCH] Optimize: utils.Contains applicable to more types --- utils/utils.go | 11 ++++++++--- utils/utils_test.go | 20 ++++++++++++++++++++ 2 files changed, 28 insertions(+), 3 deletions(-) diff --git a/utils/utils.go b/utils/utils.go index 296917b9..7500e153 100644 --- a/utils/utils.go +++ b/utils/utils.go @@ -69,9 +69,14 @@ func ToStringKey(values ...interface{}) string { return strings.Join(results, "_") } -func Contains(elems []string, elem string) bool { - for _, e := range elems { - if elem == e { +func Contains(elems interface{}, elem interface{}) bool { + reflectValue := reflect.ValueOf(elems) + if reflectValue.Kind() != reflect.Slice && reflectValue.Kind() != reflect.Array { + return false + } + + for i := 0; i < reflectValue.Len(); i++ { + if reflectValue.Index(i).Interface() == elem { return true } } diff --git a/utils/utils_test.go b/utils/utils_test.go index 27dfee16..a9aa0859 100644 --- a/utils/utils_test.go +++ b/utils/utils_test.go @@ -29,3 +29,23 @@ func TestToStringKey(t *testing.T) { } } } + +func TestContains(t *testing.T) { + tests := []struct { + elems interface{} + elem interface{} + target bool + }{ + {elems: []string{"INSERT", "VALUES", "ON CONFLICT", "RETURNING"}, elem: "RETURNING", target: true}, + {elems: []string{"INSERT", "VALUES", "ON CONFLICT"}, elem: "RETURNING", target: false}, + {elems: []int{1, 2, 3}, elem: 1, target: true}, + {elems: []interface{}{1, 2.0, "3"}, elem: 2.0, target: true}, + } + + for _, test := range tests { + exists := Contains(test.elems, test.elem) + if exists != test.target { + t.Errorf("%v not exist %v", test.elems, test.elem) + } + } +}