一个用于处理 slice 和 map 的实用程序库,侧重于类型安全和性能的开源库。
GitHub地址:https://github.com/elliotchance/pie
快速开始
pie 现阶段的版本是 v2,要求 Go 1.18+,支持泛型。如果是 Go 1.17 或更低版本,则必须使用 v1版本(https://github.com/elliotchance/pie/v1)。
package main
import (
"fmt"
"strings"
"github.com/elliotchance/pie/v2"
)
func main() {
names := pie.FilterNot([]string{"Bob", "Sally", "John", "Jane"},
func(name string) bool {
return strings.HasPrefix(name, "J")
})
fmt.Println(names) // "[Bob Sally]"
}
pie 的目标
类型安全:我从不想遇到运行时错误,因为我可能会传入错误的类型,或者在另一端执行无效的类型案例。
高性能:这些函数需要和原生 Go 实现一样快,否则这个库就没有意义了。
Nil 安全:所有的函数都会愉快地接受 nil 并将它们视为空切片。除了减少可能的 panic 外,它还使得使用更容易。
不可变:函数从不修改输入(除非在不合逻辑的情况下),不像一些内置函数,如 sort.Strings。
功能说明
pie 完整的功能说明在此网址
https://pkg.go.dev/github.com/elliotchance/pie/v2
下面,我们举例看看 pie 提供了哪些实用的功能。
数值运算
针对于 T interface{ constraints.Integer | constraints.Float,即 interger 和 float 类型支持运算功能。
func main() {
s := []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
fmt.Println(pie.Min(s)) // 最小值:1
fmt.Println(pie.Max(s)) // 最大值:10
fmt.Println(pie.Sum(s)) // 求和:55
fmt.Println(pie.Average(s)) // 取平均值:5.5
fmt.Println(pie.Product(s)) // 相乘:3628800
}
集合运算
针对于所有类型,支持两个切片之间求差集和取交集。
func main() {
a1 := []int{1, 2, 3, 4, 6, 7, 8}
a2 := []int{2, 3, 4, 5, 7, 8, 9, 10}
added, removed := pie.Diff(a1, a2) // 计算差集
fmt.Println(added, removed) // [5 9 10] [1 6]
intersect := pie.Intersect(a1, a2) // 计算交集
fmt.Println(intersect) // [2 3 4 7 8]
}
条件判断
func main() {
// 判断条件是否都满足 output: ture
fmt.Println(pie.All(s, func(x int) bool { return x > 0 }))
// 判断条件是否有满足 output: ture
fmt.Println(pie.Any(s, func(x int) bool { return x > 5 }))
}
序列化
默认的 json 序列化都会返回 error,有时候明明知道这个不会出现 error,还是得处理,pie 就把 error 忽略了。
func main() {
s := []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
jsonString := pie.JSONString(s)
fmt.Println(jsonString) // [1,2,3,4,5,6,7,8,9,10]
}
排序功能
pie 提供了排序功能,对传入的参数不做修改,保证不可变。
func main() {
s1 := []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
sorted := pie.AreSorted(s1)
fmt.Println(sorted) // true
s2 := []string{"Hello", "World", "!"}
sort := pie.Sort(s2)
fmt.Println(sort, s2) // [! Hello World] [Hello World !]
}
总结
pie 提供了很多其他功能,例如去重、遍历、过滤等操作,很多常见的功能都封装了,用起来还是很方便的。