|  |  | @ -0,0 +1,88 @@ | 
			
		
	
		
			
				
					|  |  |  | /* | 
			
		
	
		
			
				
					|  |  |  | * 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)) | 
			
		
	
		
			
				
					|  |  |  | } | 
			
		
	
		
			
				
					|  |  |  | } |