pie 封装了对切片和 map 的常用操作,能满足工作中的大部分需求。比如计算切片的交集、差集;对切片中元素按条件过滤的 Filter 函数;对切片中元素进行数据转换的 Each、Map 函数等。
pie v2 版本需要 Go 1.18+。Go1.17 及以下版本需要使用 v1 版本。
使用示例
func TestPie(t *testing.T) {
name := pie.Of([]string{"Bob", "Sally", "John", "Jane"}).
FilterNot(func(name string) bool {
return strings.HasPrefix(name, "J")
}).
Map(strings.ToUpper).
Last()
fmt.Println(name) // "SALLY"
}
pie 包的目标
- 类型安全:无论是在 v1 版本还是 v2 版本的泛型中,都对类型做了限制,所以不会遇到运行时类型错误。
- 高性能:该库需要跟原生的 Go 实现一样快,否则该库封装就没有意义。
- Nil 安全:该库的所有函数都能接收 nil 参数,并将其视为空切片,而不会引起 panic。
- 对原切片无副作用:所有的函数对传入的切片参数都不会做修改。
pie 包支持的功能
切片中的元素是否全部或任意一个满足指定的条件。
- All 函数:判断切片中的元素是否都满足指定的条件。
- Any 函数:判断切片中的元素只要有 1 个满足指定条件即可。
对切片元素进行排序功能。
- AreSorted 函数:判断切片是否是有序的
- Sort 函数:对切片元素进行排序。
- SortStableUsing 函数:使用指定的条件对切片进行排序,并且具有稳定性。
- SortUsing 函数
对切片中的元素去重。
- 判断切片中的元素是否不重复的 AreUnique 函数、去重函数 Unique
对切片进行前、后截取。
- Bottom 函数:取切片后 n 个元素
- Top 函数:取切片前 n 个元素
- DropTop 函数:丢掉切片的前 n 个元素,并返回剩余的元素切片
两个或多个切片之间的集合运算
- Diff 函数:计算两个切片中的差集
- Intersect 函数:计算两个或多个切片的交集
func TestDiff(t *testing.T) {
added, removed := pie.Diff([]string{"a", "b", "c"}, []string{"b", "c", "d"})
fmt.Println(added, removed) // [d] [a]
}
func TestIntersect(t *testing.T) {
ss2 := pie.Intersect([]string{"a", "b", "c"}, []string{"b", "c", "d"})
fmt.Println(ss2) // [c b]
}
- 切片元素进行算数运算功能(只针对 Integer 和 float 类型的切片有效)。
- Max 函数:返回切片中的最大元素
- Min 函数:返回切片中的最小元素
- Product 函数:对切片所有元素进行乘积运算
- Sum 函数:对切片中所有元素进行求和运算
- Average 函数:求所有元素的平均值
- 对切片中的元素进行数据转换功能:Each、Map、Filter、Flat、Reducer
func TestEach(t *testing.T) {
pie.Of([]string{"Bob", "Sally", "John", "Jane"}).
Each(func(s string) {
fmt.Println(s)
})
}
- 针对 map 的操作:
- Keys 函数:获取 map 的所有键
- Values 函数:获取 map 的所有值