Go 语言的 Lodash 风格库
在 JavaScript 的世界里,Lodash 是一个家喻户晓的工具库,它提供了丰富的函数,方便开发者操作数组、对象、字符串等等。Lodash 极大地提高了 JavaScript 开发者的效率,也让代码更加简洁易读。
在 Go 语言 1.18 版本之前,由于缺乏泛型,我们很难实现像 Lodash 这样功能强大且类型安全的工具库。然而,随着 Go 1.18 泛型的引入,这一切都发生了改变。
samber/lo
就是一个基于 Go 1.18+ 泛型的 Lodash 风格工具库,它提供了大量的实用函数,涵盖了数组、切片、映射、通道、字符串等多种数据类型,为 Go 语言开发者带来了极大的便利。
安装
使用以下命令即可安装 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 语言开发者更方便地操作各种数据类型,提高开发效率并使代码更加简洁易读。
使用 Go 语言连接并操作 SQLite 数据库
Go语言官方团队推荐的依赖注入工具
替代zap,Go语言官方实现的结构化日志包
Go语言常见错误 | 不使用function option模式
必看| Go语言项目结构最佳实践
点击关注并扫码添加进交流群领取「Go 语言」学习资料