samber/lo

安装

使用以下命令即可安装 samber/lo

go get github.com/samber/lo@v1

samber/lo 库遵循 SemVer 规范,v1 版本保证 API 的稳定性,不会引入破坏性变更。

使用示例

数组和切片操作

samber/lo 提供了丰富的函数用于操作数组和切片,例如:

  • Filter:过滤数组元素,返回满足条件的元素组成的新的切片。
even := lo.Filter([]int{1, 2, 3, 4}, func(x int, index int) bool {
    return x%2 == 0
})
// even: []int{2, 4}
  • Map:将一个切片转换为另一个类型的切片,通过回调函数对每个元素进行转换。
stringSlice := lo.Map([]int64{1, 2, 3, 4}, func(x int64, index int) string {
    return strconv.FormatInt(x, 10)
})
// stringSlice: []string{"1", "2", "3", "4"}
  • Reduce:将一个切片 reduce 为一个值,通过回调函数累积计算结果。
sum := lo.Reduce([]int{1, 2, 3, 4}, func(agg int, item int, index int) int {
    return agg + item
}, 0)
// sum: 10
  • Uniq:去除数组中的重复元素,返回新的切片。
uniqValues := lo.Uniq([]int{1, 2, 2, 1})
// uniqValues: []int{1, 2}

映射操作

samber/lo 也提供了用于操作映射的函数,例如:

  • Keys:返回映射的所有键组成的切片。
keys := lo.Keys(map[string]int{"foo": 1, "bar": 2})
// keys: []string{"foo", "bar"}
  • Values:返回映射的所有值组成的切片。
values := lo.Values(map[string]int{"foo": 1, "bar": 2})
// values: []int{1, 2}
  • PickBy:根据条件过滤映射,返回满足条件的键值对组成的新的映射。
filteredMap := lo.PickBy(map[string]int{"foo": 1, "bar": 2, "baz": 3}, func(key string, value int) bool {
    return value%2 == 1
})
// filteredMap: map[string]int{"foo": 1, "baz": 3}

字符串操作

samber/lo 还提供了一些字符串操作函数,例如:

  • RandomString:生成指定长度的随机字符串。
randomStr := lo.RandomString(10, lo.LettersCharset)
// randomStr: "aBcDeFgHiJ" (example)
  • PascalCase:将字符串转换为 PascalCase 格式。
pascalCaseStr := lo.PascalCase("hello_world")
// pascalCaseStr: "HelloWorld"

错误处理

samber/lo 提供了一些函数帮助我们更方便地处理错误,例如:

  • Must:如果函数调用返回错误,则 panic。
parsedTime := lo.Must(time.Parse("2006-01-02", "2022-01-15"))
// parsedTime: 2022-01-15 00:00:00 +0000 UTC
  • Try:调用函数并捕获 panic,返回是否成功执行。
success := lo.Try(func() error {
    panic("error")
    return nil
})
// success: false

并发支持

samber/lo 提供了 lop 子包,其中包含了专门为并发场景设计的函数,例如:

  • ForEach:并发地对切片中的每个元素执行回调函数。
lop.ForEach([]string{"hello", "world"}, func(x string, index int) {
    println(x)
})
// 输出 "hello" 和 "world",顺序可能不确定
  • Map:并发地对切片中的每个元素执行回调函数,并将结果收集到新的切片中。
result := lop.Map([]int64{1, 2, 3, 4}, func(x int64, index int) string {
    return strconv.FormatInt(x, 10)
})
// result: []string{"1", "2", "3", "4"}

性能

samber/lo 基于泛型实现,相比于使用反射的库,性能有显著提升。同时,它的性能也与手写 for 循环相当。

总结

samber/lo 是一个非常实用的 Go 语言工具库,它提供了类似 Lodash 的丰富功能,并利用泛型实现了类型安全和高性能。它可以帮助 Go 语言开发者更方便地操作各种数据类型,提高开发效率并使代码更加简洁易读。

GitHub - samber/lo: 💥 A Lodash-style Go library based on Go 1.18+ Generics (map, filter, contains, find...)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值