142 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			142 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| package utility
 | ||
| 
 | ||
| import "strings"
 | ||
| 
 | ||
| // ContainsStr []string 包含元素?
 | ||
| func ContainsStr(arr []string, v string) bool {
 | ||
| 	for _, a := range arr {
 | ||
| 		if a == v {
 | ||
| 			return true
 | ||
| 		}
 | ||
| 	}
 | ||
| 	return false
 | ||
| }
 | ||
| 
 | ||
| func RemoveByValue(slice []string, value string) []string {
 | ||
| 	for i, v := range slice {
 | ||
| 		if v == value {
 | ||
| 			// 找到值,删除对应索引
 | ||
| 			return append(slice[:i], slice[i+1:]...)
 | ||
| 		}
 | ||
| 	}
 | ||
| 	return slice // 未找到返回原切片
 | ||
| }
 | ||
| 
 | ||
| // ContainsInt []int 包含元素?
 | ||
| func ContainsInt(arr []int, v int) bool {
 | ||
| 	for _, a := range arr {
 | ||
| 		if a == v {
 | ||
| 			return true
 | ||
| 		}
 | ||
| 	}
 | ||
| 	return false
 | ||
| }
 | ||
| 
 | ||
| func HasSuffix(data string, suffixs []string) bool {
 | ||
| 	for _, suffix := range suffixs {
 | ||
| 		if strings.HasSuffix(data, suffix) {
 | ||
| 			return true
 | ||
| 		}
 | ||
| 	}
 | ||
| 	return false
 | ||
| }
 | ||
| 
 | ||
| // SplitSlice 将 []string 切片根据最大数量分割成二维数组
 | ||
| func SplitSlice[T any](slice []T, maxSize int) [][]T {
 | ||
| 	var result [][]T
 | ||
| 
 | ||
| 	// 遍历切片,每次取 maxSize 个元素
 | ||
| 	for i := 0; i < len(slice); i += maxSize {
 | ||
| 		end := i + maxSize
 | ||
| 		// 如果 end 超出切片长度,则取到切片末尾
 | ||
| 		if end > len(slice) {
 | ||
| 			end = len(slice)
 | ||
| 		}
 | ||
| 		// 将当前段添加到结果中
 | ||
| 		result = append(result, slice[i:end])
 | ||
| 	}
 | ||
| 
 | ||
| 	return result
 | ||
| }
 | ||
| 
 | ||
| //// 切片;
 | ||
| //type slices struct {
 | ||
| //}
 | ||
| //
 | ||
| //// 构建;
 | ||
| //func Slices() *slices {
 | ||
| //	return &slices{}
 | ||
| //}
 | ||
| //
 | ||
| //// 包含元素?
 | ||
| //func (this *slices) Contains(s interface{}, v interface{}) bool {
 | ||
| //	// 相关定义;
 | ||
| //	ss := reflect.Indirect(reflect.ValueOf(s))
 | ||
| //	slen := ss.Len()
 | ||
| //	// 遍历;
 | ||
| //	for i := 0; i < slen; i++ {
 | ||
| //		// 定位元素;
 | ||
| //		sv := reflect.Indirect(ss.Index(i))
 | ||
| //		if fmt.Sprint(sv.Interface()) == fmt.Sprint(v) {
 | ||
| //			return true
 | ||
| //		}
 | ||
| //	}
 | ||
| //	return false
 | ||
| //}
 | ||
| //
 | ||
| //// 转为切片;
 | ||
| //func (this *slices) Slice(s interface{}) []interface{} {
 | ||
| //	// 相关定义;
 | ||
| //	ss := reflect.Indirect(reflect.ValueOf(s))
 | ||
| //	slen := ss.Len()
 | ||
| //	// 遍历;
 | ||
| //	out := make([]interface{}, slen)
 | ||
| //	for i := 0; i < slen; i++ {
 | ||
| //		// 追加;
 | ||
| //		out[i] = ss.Index(i).Interface()
 | ||
| //	}
 | ||
| //	return out
 | ||
| //}
 | ||
| //
 | ||
| //// 校验为nil?
 | ||
| //func (this *slices) IsNil(v interface{}) bool {
 | ||
| //	if v == nil {
 | ||
| //		return true
 | ||
| //	}
 | ||
| //	vi := reflect.ValueOf(v)
 | ||
| //	if vi.Kind() == reflect.Ptr {
 | ||
| //		return vi.Elem().IsNil()
 | ||
| //	}
 | ||
| //	return vi.IsNil()
 | ||
| //}
 | ||
| //
 | ||
| //// StringSliceReflectEqual 判断 string和slice 是否相等
 | ||
| //// 因为使用了反射,所以效率较低,可以看benchmark结果
 | ||
| //func (this *slices) StringSliceReflectEqual(a, b []string) bool {
 | ||
| //	return reflect.DeepEqual(a, b)
 | ||
| //}
 | ||
| //
 | ||
| //// StringSliceEqual 判断 string和slice 是否相等
 | ||
| //// 使用了传统的遍历方式
 | ||
| //func (this *slices) StringSliceEqual(a, b []string) bool {
 | ||
| //	if len(a) != len(b) {
 | ||
| //		return false
 | ||
| //	}
 | ||
| //
 | ||
| //	// reflect.DeepEqual的结果保持一致
 | ||
| //	if (a == nil) != (b == nil) {
 | ||
| //		return false
 | ||
| //	}
 | ||
| //
 | ||
| //	// bounds check 边界检查
 | ||
| //	// 避免越界
 | ||
| //	b = b[:len(a)]
 | ||
| //	for i, v := range a {
 | ||
| //		if v != b[i] {
 | ||
| //			return false
 | ||
| //		}
 | ||
| //	}
 | ||
| //
 | ||
| //	return true
 | ||
| //}
 |