github.com/eframework-cn/EP.GO.UTIL@v1.0.0/xcollect/any.go (about)

     1  //-----------------------------------------------------------------------//
     2  //                     GNU GENERAL PUBLIC LICENSE                        //
     3  //                        Version 2, June 1991                           //
     4  //                                                                       //
     5  // Copyright (C) EFramework, https://eframework.cn, All rights reserved. //
     6  // Everyone is permitted to copy and distribute verbatim copies          //
     7  // of this license document, but changing it is not allowed.             //
     8  //                   SEE LICENSE.md FOR MORE DETAILS.                    //
     9  //-----------------------------------------------------------------------//
    10  
    11  // 封装了any/int/int32/int64/string数组/切片的常用操作.
    12  package xcollect
    13  
    14  // 从数组/切片中索引元素([]interface{})
    15  //	arr: 数组/切片
    16  //	ele: 元素
    17  func IndexForAny(arr []interface{}, ele interface{}) int {
    18  	if arr != nil {
    19  		switch ele.(type) {
    20  		case func(ele interface{}) bool:
    21  			for k, v := range arr {
    22  				if ele.(func(ele interface{}) bool)(v) {
    23  					return k
    24  				}
    25  			}
    26  			break
    27  		case interface{}:
    28  			for k, v := range arr {
    29  				if v == ele {
    30  					return k
    31  				}
    32  			}
    33  			break
    34  		}
    35  	}
    36  	return -1
    37  }
    38  
    39  // 数组/切片是否存在元素([]interface{})
    40  //	arr: 数组/切片
    41  //	ele: 元素
    42  func ContainsForAny(arr []interface{}, ele interface{}) bool {
    43  	if arr != nil {
    44  		return IndexForAny(arr, ele) >= 0
    45  	}
    46  	return false
    47  }
    48  
    49  // 从数组/切片中移除元素([]interface{})
    50  //	arr: 数组/切片
    51  //	ele: 元素
    52  func RemoveForAny(arr []interface{}, ele interface{}) []interface{} {
    53  	if arr != nil {
    54  		switch ele.(type) {
    55  		case func(ele interface{}) bool:
    56  			for i := 0; i < len(arr); {
    57  				v := arr[i]
    58  				if ele.(func(ele interface{}) bool)(v) {
    59  					arr = append(arr[:i], arr[i+1:]...)
    60  				} else {
    61  					i++
    62  				}
    63  			}
    64  			break
    65  		case interface{}:
    66  			for {
    67  				idx := IndexForAny(arr, ele)
    68  				if idx >= 0 {
    69  					arr = append(arr[:idx], arr[idx+1:]...)
    70  				} else {
    71  					break
    72  				}
    73  			}
    74  			break
    75  		}
    76  	}
    77  	return arr
    78  }
    79  
    80  // 从数组/切片中移除元素([]interface{})
    81  //	arr: 数组/切片
    82  //	index: 索引
    83  func DeleteForAny(arr []interface{}, index int) []interface{} {
    84  	if arr != nil {
    85  		if index < len(arr) {
    86  			arr = append(arr[:index], arr[index+1:]...)
    87  		}
    88  	}
    89  	return arr
    90  }
    91  
    92  // 在数组/切片中新增元素([]interface{})
    93  //	arr: 数组/切片
    94  //	ele: 元素
    95  func AppendForAny(arr []interface{}, ele interface{}) []interface{} {
    96  	return append(arr, ele)
    97  }