/* * string functions */ package helper import ( "errors" "fmt" "sort" ) // 求差集 func Diff(slice1, slice2 []string) []string { m := make(map[string]int) nn := make([]string, 0) inter := Intersect(slice1, slice2) for _, v := range inter { m[v]++ } for _, value := range slice1 { times, _ := m[value] if times == 0 { nn = append(nn, value) } } return nn } // 求交集 func Intersect(slice1, slice2 []string) []string { m := make(map[string]int) nn := make([]string, 0) for _, v := range slice1 { m[v]++ } for _, v := range slice2 { times, _ := m[v] if times == 1 { nn = append(nn, v) } } return nn } // 求并集 func Union(slice1, slice2 []string) []string { m := make(map[string]int) for _, v := range slice1 { m[v]++ } for _, v := range slice2 { times, _ := m[v] if times == 0 { slice1 = append(slice1, v) } } 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)) } } // 将切片字符串(数字型)排序 func StringSliceSort(str []string, sort_type string) ([]string, error) { int_arr := []int{} string_arr := []string{} if len(str) < 1 { return []string{}, nil } for _, val := range str { int_arr = append(int_arr, ToInt(val)) } if sort_type == "desc" { sort.Sort(sort.Reverse(sort.IntSlice(int_arr))) }else{ sort.Ints(int_arr) } for _, val_int := range int_arr { string_arr = append(string_arr, ToStr(val_int)) } return string_arr, nil }