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

Go 语言的 Lodash 风格库

原创 lo 源自开发者
 
源自开发者
专注于提供关于Go语言的实用教程、案例分析、最新趋势,以及云原生技术的深度解析和实践经验分享。
273篇原创内容

在 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 语言」学习资料

图片

Golang · 目录
上一篇Bilibili 开源 Go 微服务框架 Kratos
阅读原文
阅读 1229
 
 
 
 
 
 
 
 
 
posted @ 2024-07-18 08:25  技术颜良  阅读(163)  评论(0编辑  收藏  举报