diff --git a/slice.go b/slice.go index 6627ebb..97d3bf8 100644 --- a/slice.go +++ b/slice.go @@ -3,6 +3,11 @@ */ package helper +import ( + "errors" + "fmt" +) + // 求差集 func Diff(slice1, slice2 []string) []string { m := make(map[string]int) @@ -52,5 +57,32 @@ func Union(slice1, slice2 []string) []string { } } return slice1 +} +func Unique(originals interface{}) (interface{}, error) { + temp := map[string]struct{}{} + switch slice := originals.(type) { + case []string: + result := make([]string, 0, len(originals.([]string))) + for _, item := range slice { + key := fmt.Sprint(item) + if _, ok := temp[key]; !ok { + temp[key] = struct{}{} + result = append(result, item) + } + } + return result, nil + case []int64: + result := make([]int64, 0, len(originals.([]int64))) + for _, item := range slice { + key := fmt.Sprint(item) + if _, ok := temp[key]; !ok { + temp[key] = struct{}{} + result = append(result, item) + } + } + return result, nil + default: + return nil, errors.New(fmt.Sprintf("Unknown type: %T", slice)) + } } diff --git a/slice_test.go b/slice_test.go index 9217c1b..118a6bc 100644 --- a/slice_test.go +++ b/slice_test.go @@ -25,3 +25,9 @@ func Test_Union(t *testing.T) { cc := Union(aa, bb) fmt.Println(cc) } + +func Test_Unique(t *testing.T) { + var str = []string{"1", "2", "2"} + ret, err := Unique(str) + fmt.Println(ret, err) +}