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 }