You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
	
	
		
			122 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			Go
		
	
			
		
		
	
	
			122 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			Go
		
	
| package tools
 | |
| 
 | |
| import (
 | |
| 	"reflect"
 | |
| )
 | |
| 
 | |
| func UniqueSlice(slice *[]interface{}) {
 | |
| 	found := make(map[interface{}]bool)
 | |
| 	total := 0
 | |
| 	for i, val := range *slice {
 | |
| 		if _, ok := found[val]; !ok {
 | |
| 			found[val] = true
 | |
| 			(*slice)[total] = (*slice)[i]
 | |
| 			total++
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	*slice = (*slice)[:total]
 | |
| }
 | |
| 
 | |
| func InsertToSlice(slice, insertion []interface{}, index int) []interface{} {
 | |
| 	result := make([]interface{}, len(slice)+len(insertion))
 | |
| 	at := copy(result, slice[:index])
 | |
| 	at += copy(result[at:], insertion)
 | |
| 	copy(result[at:], slice[index:])
 | |
| 	return result
 | |
| }
 | |
| 
 | |
| func AppendToSlice(slice, appendItems []interface{}) []interface{} {
 | |
| 	return InsertToSlice(slice, appendItems, len(slice))
 | |
| }
 | |
| 
 | |
| func ReverseSlice(slice []interface{}) []interface{} {
 | |
| 	if len(slice) == 0 || len(slice) == 1 {
 | |
| 		return slice
 | |
| 	}
 | |
| 	return append(ReverseSlice(slice[1:]), slice[0])
 | |
| }
 | |
| 
 | |
| func RemoveFromSlice(slice []interface{}, start int, end int) []interface{} {
 | |
| 	return append(slice[:start], slice[end+1:]...)
 | |
| }
 | |
| 
 | |
| // condition is the function which is used to check if the element shall be removed
 | |
| func RemoveFromSliceIf(slice []interface{}, condition func(interface{}) bool) []interface{} {
 | |
| 	result := make([]interface{}, len(slice))
 | |
| 	for _, item := range slice {
 | |
| 		// if matched, just ignore
 | |
| 		if !condition(item) {
 | |
| 			result = append(result, item)
 | |
| 		}
 | |
| 	}
 | |
| 	return result
 | |
| }
 | |
| 
 | |
| func Int8SliceSearch(s []int8, t int8) bool {
 | |
| 	for _, n := range s {
 | |
| 		if n == t {
 | |
| 			return true
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	return false
 | |
| }
 | |
| 
 | |
| func Int32SliceSearch(s []int32, t int32) bool {
 | |
| 	for _, n := range s {
 | |
| 		if n == t {
 | |
| 			return true
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	return false
 | |
| }
 | |
| 
 | |
| func Int64SliceSearch(s []int64, t int64) bool {
 | |
| 	for _, n := range s {
 | |
| 		if n == t {
 | |
| 			return true
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	return false
 | |
| }
 | |
| 
 | |
| func StringSliceSearch(s []string, t string) bool {
 | |
| 	for _, n := range s {
 | |
| 		if n == t {
 | |
| 			return true
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	return false
 | |
| }
 | |
| 
 | |
| func Reverse(slice interface{}, size func() int, swap func(i, j int)) {
 | |
| 	if swap == nil || size == nil {
 | |
| 		return
 | |
| 	}
 | |
| 
 | |
| 	for i := 0; i < size()/2; i++ {
 | |
| 		swap(i, size()-i-1)
 | |
| 	}
 | |
| }
 | |
| 
 | |
| func CheckDuplicate(slice interface{}, check func(i, j int) bool) bool {
 | |
| 	if slice == nil || check == nil {
 | |
| 		return true
 | |
| 	}
 | |
| 
 | |
| 	rv := reflect.ValueOf(slice)
 | |
| 	len := rv.Len()
 | |
| 	for i := 0; i < len; i++ {
 | |
| 		for j := i + 1; j < len; j++ {
 | |
| 			if check(i, j) {
 | |
| 				return true
 | |
| 			}
 | |
| 		}
 | |
| 	}
 | |
| 	return false
 | |
| }
 |