Documentation ¶
Index ¶
- func Append[T any](s []T, eles ...T) []Tdeprecated
- func Compact[T comparable](s []T) []T
- func Contains[T comparable](s []T, element T) bool
- func ContainsBy[T any](s []T, predicate func(item T) bool) bool
- func ContainsStringIgnoreCase(s []string, str string) bool
- func ConvertElementType[T any, R any](s []T, iteratee func(item T, index int) R) []R
- func ConvertElementTypeInParallel[T any, R any](s []T, iteratee func(item T, index int) R) []R
- func Copy[T any](src []T) []T
- func Copy1[T any](src []T) []Tdeprecated
- func Copy2[T any](src []T) []Tdeprecated
- func CopyToDest[T any](src, dest []T) int
- func DeepCopy[T any](src []T) ([]T, error)
- func EmptyToNil[T any](s []T) []T
- func Filter[V any](s []V, predicate func(item V, index int) bool) []V
- func FilterAndRevise[T any, R any](s []T, callback func(item T, index int) (R, bool)) []R
- func Find[T any](s []T, predicate func(item T) bool) (T, bool)
- func FindIndexOf[T any](s []T, predicate func(item T) bool) (T, int, bool)
- func FindLastIndexOf[T any](s []T, predicate func(item T) bool) (T, int, bool)
- func FindOrElse[T any](s []T, fallback T, predicate func(item T) bool) T
- func ForEach[T any](s []T, iteratee func(item T, index int))
- func ForEachInParallel[T any](s []T, iteratee func(item T, index int))
- func Get[T any](s []T, index int) Tdeprecated
- func GetFirstItemWithDefault[T any](def T, args ...T) T
- func Group[T any, U comparable](s []T, iteratee func(item T) U) map[U][]T
- func GroupInParallel[T any, U comparable](s []T, iteratee func(item T) U) map[U][]T
- func IndexOf[T comparable](s []T, element T) int
- func Intercept[T any](s []T, from, to int, maxArgs ...int) []T
- func InterceptAfter[T any](s []T, index int) []T
- func InterceptBefore[T any](s []T, index int) []T
- func IsEmpty[T any](s []T) bool
- func IsNotEmpty[T any](s []T) bool
- func IsSorted[T constraints.Ordered](s []T) bool
- func IsSortedByKey[T any, K constraints.Ordered](s []T, iteratee func(item T) K) bool
- func Join(s []string, sep string) string
- func LastIndexOf[T comparable](s []T, element T) int
- func Merge[T comparable](slices ...[]T) []T
- func Reduce[T any, R any](s []T, accumulator func(agg R, item T, index int) R, initial R) R
- func ReduceRight[T any, R any](s []T, accumulator func(agg R, item T, index int) R, initial R) R
- func Remove[T comparable](s []T, item T) ([]T, bool)
- func RemoveByIndex[T any](s []T, index int) (s1 []T, item T, ok bool)deprecated
- func RemoveEmpty(s []string, trimArgs ...bool) []string
- func RemoveFirst[T any](s []T) (s1 []T, item T, ok bool)
- func RemoveLast[T any](s []T) (s1 []T, item T, ok bool)
- func Reverse[T any](s []T) []T
- func Shuffle[T any](s []T) []T
- func SliceToMap[T any, K comparable, V any](s []T, transform func(item T) (K, V)) map[K]V
- func Sort[T constraints.Ordered](s []T, descArgs ...bool) []T
- func SortComplexSlice(data sort.Interface, args ...bool) sort.Interface
- func Swap[T any](s []T, i, j int)
- func ToString[T any](s []T) string
- func Uniq[T comparable](s []T) []T
- func UniqBy[T any, U comparable](collection []T, iteratee func(item T) U) []T
- type RemoveJudge
Constants ¶
This section is empty.
Variables ¶
This section is empty.
Functions ¶
func Append
deprecated
func Append[T any](s []T, eles ...T) []T
Append 向slice实例的"最后面"添加元素
Deprecated: 考虑性能的场景下,不建议直接调用此方法(此方法仅供展示传参规范).
PS: (1) 传参s == nil的情况下,此时如果eles数量>=1,将返回1个非nil的slice实例,否则将返回nil. (2) append()返回的是1个新的slice实例.
@param s 可以为nil @return 可能为nil
e.g. ([]string(nil)) => nil ([]string(nil), []string(nil)...) => nil ([]string(nil), "0") => []string{"0"}
func Compact ¶ added in v1.3.11
func Compact[T comparable](s []T) []T
Compact 去除零值.
@param s 可以为nil;不会修改传参s @return 必定不为nil(保底为空的slice实例)
e.g.
s := []string{"", "foo", "", "bar", ""} s1 := sliceKit.Compact[string](s) fmt.Println(s1) // [foo bar]
func Contains ¶
func Contains[T comparable](s []T, element T) bool
Contains
@param s 可以为nil(返回false)
func ContainsStringIgnoreCase ¶
ContainsStringIgnoreCase 字符串str是否在切片s中?(不区分大小写)
func ConvertElementType ¶
ConvertElementType 转换切片实例的元素类型
@param string 可以为nil @param iteratee 不能为nil,会导致panic: runtime error: invalid memory address or nil pointer dereference @return 必定不为nil(保底空的slice实例)
e.g. []int => []string
s := sliceKit.ConvertElementType([]int{0, 1, 2, 3}, func(item int, index int) string { return "0x" + strconv.Itoa(item) }) fmt.Println(s) // [0x0 0x1 0x2 0x3]
func ConvertElementTypeInParallel ¶
ConvertElementTypeInParallel 转换切片实例的元素类型
PS: 使用协程更加高效,但要慎用!!!
@param string 可以为nil @param iteratee 不能为nil,会导致panic: runtime error: invalid memory address or nil pointer dereference @return 必定不为nil(保底空的slice实例)
func Copy ¶
func Copy[T any](src []T) []T
Copy 浅克隆(浅拷贝)
参考: golang复制切片的方法(避免操作同一底层数组) https://blog.csdn.net/weixin_43970884/article/details/126051345
@param src 可以为nil
e.g.
s0 := []string{"0", "1", "2"} s1 := sliceKit.Copy(s0) s1[0] = "3" fmt.Println(s0) // [0 1 2] fmt.Println(s1) // [3 1 2]
func CopyToDest ¶
CopyToDest 将src的元素复制到dest中(可能会修改dest的内容,但dest的内存地址不变!!!)
PS: (1) src和dest中只要有一个为nil(包括两个都为nil的情况),返回值必定为0 && 不会修改dest; (2) src和dest都不为nil的情况下,len(src) <= len(dest),复制 src的前n个元素 并用他们覆盖 dest的前n个元素(n == len(src),可能为0); (3) src和dest都不为nil的情况下,len(src) > len(dest),复制 src的前n个元素 并用他们覆盖 dest的前n个元素(n == len(dest),可能为0).
@param src 可以为nil @param dest 可以为nil @return 被复制的元素的个数(即len(src)和len(dest)间的最小值;>= 0)
e.g. nil的情况 [byte](nil, nil) => 0 [byte]([]byte("abc"), nil) => 0 [byte](nil, []byte("abcde")) => 0 e.g.1 正常情况 ([]byte("012"), []byte("abcde")) => 3(dest变为[]byte("012de")) ([]byte("01234"), []byte("abc")) => 3(dest变为[]byte("012"))
func DeepCopy ¶
DeepCopy 深拷贝
e.g.
([]string(nil)) => (nil, nil)
e.g.1
s := []*Bean{{Id: 0}, {Id: 1}} s1, err := sliceKit.DeepCopy(s) if err != nil { panic(err) } fmt.Printf("%p\n", &s) // 0x1400000c048 fmt.Printf("%p\n", s[0]) // 0x140000220a0 fmt.Printf("%p\n", s[1]) // 0x140000220a8 fmt.Println("==================") fmt.Printf("%p\n", &s1) // 0x1400000c060 fmt.Printf("%p\n", s1[0]) // 0x140000220b0 fmt.Printf("%p\n", s1[1]) // 0x140000220d8
func EmptyToNil ¶
func EmptyToNil[T any](s []T) []T
func Filter ¶
Filter 过滤.
@param s (1) 可以为nil
(2) 不会修改传参s
@param predicate (1) true: 该元素加到返回的slice实例中
(2) 不能为nil,会导致panic: runtime error: invalid memory address or nil pointer dereference
@return 必定不为nil(保底为空的slice实例)
e.g.
s := sliceKit.Filter([]int{0, 1, 2, 3}, func(item int, index int) bool { return item >= 2 }) fmt.Println(s) // [2 3]
func FilterAndRevise ¶ added in v1.3.11
FilterAndRevise 过滤(可额外处理满足条件的元素).
@param s 可以为nil @param callback (1) 不能为nil
(2) 第2个返回值: 是否满足过滤条件? (3) 第2个返回值 == true的情况下,将第1个返回值加到返回的slice实例中.
@return 必定不为nil(保底为空的slice实例)
e.g.
s := sliceKit.FilterAndRevise([]string{"cpu", "gpu", "mouse", "keyboard"}, func(item string, index int) (string, bool) { if strings.HasSuffix(item, "pu") { return "right-" + item, true } return "", false }) fmt.Println(s) // [right-cpu right-gpu]
func FindIndexOf ¶
FindIndexOf
@param s 可以为nil @param predicate 返回true: 该元素是要找的 @param 如果找不到,第2个返回值为-1
func FindLastIndexOf ¶
FindLastIndexOf
@param s 可以为nil @param predicate 返回true: 该元素是要找的 @param 如果找不到,第2个返回值为-1
func FindOrElse ¶
FindOrElse
@param s 可以为nil @param fallback 默认值(找不到就返回它) @param predicate 返回true: 该元素是要找的
func GetFirstItemWithDefault ¶
func GetFirstItemWithDefault[T any](def T, args ...T) T
GetFirstItemWithDefault 主要用于: 从不定参数(...)中取第一个值(不存在则取默认值)
PS: (1) 因为Golang不支持方法重载; (2) T类型值可能为nil的情况,要注意防坑.
@param args 要么是: nil;要么是: 长度>=1的切片实例
func Group ¶
func Group[T any, U comparable](s []T, iteratee func(item T) U) map[U][]T
Group 分组
PS: 不会修改传参s.
@param s 可以为nil @param iteratee 不能为nil @return 保底为空的map实例
e.g.
s := []int{0, 1, 2, 3, 4, 5} m := sliceKit.Group[int, int](s, func(i int) int { return i % 3 }) fmt.Println(s) // [0 1 2 3 4 5] fmt.Println(m) // map[0:[0 3] 1:[1 4] 2:[2 5]]
func GroupInParallel ¶
func GroupInParallel[T any, U comparable](s []T, iteratee func(item T) U) map[U][]T
func IndexOf ¶
func IndexOf[T comparable](s []T, element T) int
IndexOf
@param s 可以为nil(此时返回-1) @return 如果不存在于切片实例中的话,返回-1
func Intercept ¶
Intercept 截取切片实例
参考: golang2021数据格式(23)切片截取 https://baijiahao.baidu.com/s?id=1711198159326157378
PS: (1) 如果from == to且不存在越界的情况,将返回len为0的slice实例(非nil).
@param s 可以为nil @param from 取值范围: [0, len(s))] @param to 取值范围: [0, len(s))] @return [from, to)
e.g. s := []int{0, 1, 2, 3, 4, 5} fmt.Println(sliceKit.Intercept(s, len(s), len(s))) // [](非nil)
func InterceptAfter ¶
InterceptAfter
@param s 可以为nil @param index 取值范围: [0, length] @return [index, length)
func InterceptBefore ¶
InterceptBefore
@param s 可以为nil @param index 取值范围: [0, length] @return [0, index)
func IsSorted ¶ added in v1.3.11
func IsSorted[T constraints.Ordered](s []T) bool
IsSorted 传参切片实例是否有序?
@param s (1) 可以为nil
(2) 如果 len(s) <= 1 ,返回值一定为true
e.g. [int](nil) => true ([]string{}) => true ([]string{"b"}) => true ([]string{"b", "a"}) => false ([]int{0, 1, 9, 100}) => true
func IsSortedByKey ¶ added in v1.3.11
func IsSortedByKey[T any, K constraints.Ordered](s []T, iteratee func(item T) K) bool
IsSortedByKey 传参切片实例是否有序?
@param s (1) 可以为nil
(2) 如果 len(s) <= 1 ,返回值一定为true
e.g.
flag := sliceKit.IsSortedByKey([]string{"a", "aa", "bb", "ccc"}, func(s string) int { return len(s) }) fmt.Println(flag) // true
func Join ¶
Join []string => string
@param sep 分隔符
e.g. (nil, "-") => "" ([]string{}, "-") => "" ([]string{"0", "1", "2", "3"}, "-") => "0-1-2-3"
func LastIndexOf ¶
func LastIndexOf[T comparable](s []T, element T) int
LastIndexOf
@param s 可以为nil(此时返回-1) @return 如果不存在于切片实例中的话,返回-1
func Merge ¶
func Merge[T comparable](slices ...[]T) []T
Merge 合并多个切片(不会去重)
PS: (1) 先要传参nil的话,必须要造型. e.g. []string(nil) (2) 第1个传参可以为nil
@return 可能为nil
e.g. ([]string(nil), []string{"1", "2"}) => [1 2] ([]string{"1", "2"}, []string(nil)) => [1 2]
([]string(nil)) => nil ([]string{}) => []
([]string(nil), []string{"a", "b"}, []string(nil), []string{"b", "c"}) => [a b b c]
func Reduce ¶
Reduce 将slice实例归纳为一个值(从左到右遍历).
PS: 排除骚操作,不会修改传参s.
@param s 可以为nil @param accumulator 不能为nil @param initial 初始值
func ReduceRight ¶
ReduceRight 将slice实例归纳为一个值(从右到左遍历;和 Reduce 相反).
PS: 排除骚操作,不会修改传参s.
@param s 可以为nil @param accumulator 不能为nil @param initial 初始值
func Remove ¶
func Remove[T comparable](s []T, item T) ([]T, bool)
Remove 移除元素.
PS: (1) 可能会修改传参s!!!(因为截取;想绝对不修改传参s的话,可以在调用此方法前对传参s进行拷贝(深浅拷贝由类型T决定,e.g.[]string用浅拷贝就行了),然后将副本作为传参) (2) 切片实例s中,存在多个item的话,仅会移除第一个.
e.g.
texts := []string{"0", "1", "2"} fmt.Println(texts) // [0 1 2] texts1, _ := sliceKit.Remove(texts, "1") fmt.Println(texts) // [0 2 2] fmt.Println(texts1) // [0 2]
func RemoveByIndex
deprecated
RemoveByIndex 根据下标删除指定元素.
Deprecated: 考虑性能的场景下,不建议直接调用此方法(此方法仅供展示传参规范).
PS: (0) 也可以用于移除"第一个"或"最后一个"个元素; (1) 为什么要有两个返回值且第一个是slice?因为 append() 并不会修改传参slice,返回的是一个新的slice. (2) 调用此方法后,必须第一时间将 第一个返回值 赋值给 传进来的那个slice变量!!!
@param s 可以为nil @param index 下标(索引),取值范围: [0, length) @return 移除后的slice + 被移除的元素 + 是否成功移除?(主要是针对nil的情况)
func RemoveEmpty ¶
RemoveEmpty
@param trimArgs 是否 先 对每个元素进行trim操作?默认:false
e.g. (nil) => nil ([]string{""}) => []string{}
func RemoveFirst ¶
RemoveFirst 移除第一个元素(如果有的话)
@param s 可以为nil
e.g. [int](nil) => [] 0 false ([]int{0}) => [] 0 true ([]int{0, 1}) => [1] 0 true
func RemoveLast ¶
RemoveLast 移除最后一个元素(如果有的话)
@param s 可以为nil
e.g. [int](nil) => [] 0 false ([]int{0}) => [] 0 true ([]int{0, 1}) => [0] 1 true
func Reverse ¶
func Reverse[T any](s []T) []T
Reverse 反转切片.
PS: 会改变传参s的内容.
@param s 可以为nil
e.g. (nil) => nil ([]string{"0", "1", "2", "3"}) => [3 2 1 0]
func Shuffle ¶
func Shuffle[T any](s []T) []T
Shuffle 随机打乱切片.
PS: 会改变传参s的内容.
@param s 可以为nil
e.g. [string](nil) => nil []string{"0", "1", "2", "3"} => [2 0 3 1]
func SliceToMap ¶
func SliceToMap[T any, K comparable, V any](s []T, transform func(item T) (K, V)) map[K]V
SliceToMap slice实例 => map实例
@param s 可以为nil @param transform 不能为nil(除非s == nil),否则会导致panic: runtime error: invalid memory address or nil pointer dereference @return 必定不为nil(保底为空的map实例)
e.g.
m := sliceKit.SliceToMap[string, string, string]([]string{"0", "1"}, func(item string) (string, string) { return "key" + item, "value" + item }) fmt.Println(m) // map[key0:value0 key1:value1]
func Sort ¶
func Sort[T constraints.Ordered](s []T, descArgs ...bool) []T
Sort (简单数据类型)排序
@param s 可以为nil,将返回nil @param descArgs true: 降序
false: 升序(默认)
@return 可能为nil
e.g. [int](nil) => nil [int](nil, true) => nil ([]int{0, 1, 9, 8, 1}) => [0 1 1 8 9] ([]int{0, 1, 9, 8, 1}, true) => [9 8 1 1 0]
func SortComplexSlice ¶
SortComplexSlice 排序复杂类型的slice实例(元素的类型可以为自定义结构体)
PS: (1) 需要注意的是 sort.Sort() 函数不能保证数据排序是稳定的,
如果需要保证数据排序稳定,可以使用 sort.Stable() 函数。(“稳定”的含义是原始数据中 a 和 b 的值相等,排序前 a 排在 b 的前面,排序后 a 仍排在 b 的前面)
(2) 现成的sort.Interface接口的实现: sort.IntSlice、sort.Float64Slice、sort.StringSlice.
@param data 可以为nil,将返回nil @param args true: 稳定; false: 不稳定(默认;大部分场景这就够了) @return 可能为nil
e.g. s := []int{0, 2, 3, 1} sliceKit.SortComplexSlice(sort.IntSlice(s)) fmt.Println(s) // [0 1 2 3]
func Swap ¶
Swap 交换切片实例中两个元素的值
PS: (1)传参s不能为nil,会panic(下标越界); (2)此方法会修改传参s(虽然golang是值传递); (3)传参i、j:下标越界会导致panic.
@param s 不能为nil @param i 第1个元素的下标(从0开始) @param j 第2个元素的下标(从0开始)
e.g.
s := []int{1, 0, 100} sliceKit.Swap(s, 0, 2) fmt.Println(s) // [100 0 1]
func ToString ¶
ToString 切片实例(元素任意类型) => string
参考: https://mp.weixin.qq.com/s/tvy9L-pb_8WFWAmA9u-bMg
e.g. ([]int{-1, 0, 1}) => "[-1 0 1]"
func Uniq ¶
func Uniq[T comparable](s []T) []T
Uniq 去重
PS: 不会修改传参s.
@param s 可以为nil @return 必定不为nil(保底为空的slice实例)
e.g.
s := sliceKit.Uniq([]interface{}{0, 1, 2, 0, "1", "2", "1"}) fmt.Println(s) // [0 1 2 1 2](前3个为int类型,后2个为string类型)
func UniqBy ¶
func UniqBy[T any, U comparable](collection []T, iteratee func(item T) U) []T
UniqBy
PS: 不会修改传参s.
@param s 可以为nil @param iteratee 不能为nil @return 必定不为nil(保底为空的slice实例)
e.g.
s0 := []int{0, 1, 2, 3, 4, 5} s1 := sliceKit.UniqBy[int, int](s0, func(i int) int { return i % 3 }) fmt.Println(s0) // [0 1 2 3 4 5] fmt.Println(s1) // [0 1 2]
Types ¶
type RemoveJudge ¶
type RemoveJudge[T comparable] func(ele T) (remove bool, interrupt bool)
RemoveJudge 判断是否将元素从slice中移除
@param ele slice中的1个元素 @return remove 是否将该元素移除? @return interrupt 是否中断遍历?