/*
|
|
* string functions
|
|
*/
|
|
package helper
|
|
|
|
import (
|
|
"errors"
|
|
"fmt"
|
|
)
|
|
|
|
// 求差集
|
|
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))
|
|
}
|
|
}
|