一个用于处理 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 提供了很多其他功能,例如去重、遍历、过滤等操作,很多常见的功能都封装了,用起来还是很方便的。