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

news/2024/9/19 2:04:29/文章来源:https://www.cnblogs.com/cheyunhua/p/18308655

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
 
 
 
 
 
 
 
 
 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/745696.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

有向图的连通性(判强连通)

讲义 Kosaraju #include <bits/stdc++.h> using namespace std; const int N=1e4+5;int n, m, u1, v1, vis[N], vis2[N], cnt=0; vector<int> a[N], ra[N]; stack<int> st; void dfs(int u) {if (vis[u]) return ;vis[u]=1;for (int i=0; i<a[u].size…

HarmonyOS NEXT 学习笔记4--双向绑定$$

HarmonyOS NEXT 学习笔记4--双向绑定$$1.代码: @Entry @Component struct Page_checkbox {@StateisChecked:boolean = truebuild() {Column() {Text(this.isChecked + )Checkbox()// .shape(CheckBoxShape.ROUNDED_SQUARE)// 这里有坑,编译器会报错.select($$this.isChecked)/…

AI时代你一定要知道的Agent概念

这两年,随着人工智能(AI)和计算能力的发展,AI应用的落地速度大大加快。以ChatGPT为代表的AI应用迅速火遍全球,成为打工人的常用工具。紧接着,多模态、AI Agent等各种高大尚的名词也逐渐进入大众视野,吸引了大量关注。那么,到底什么是AI Agent?下文半支烟将带你详细了解…

读写给大家的AI极简史笔记01机器决策

读写给大家的AI极简史笔记01机器决策1. 识别、洞察、行动 1.1. 当你不知道该做什么时,智力就是你需要使用的东西。 1.1.1. [瑞士]让皮亚杰(Jean Piaget),生物学家和发展心理学家 1.2. 对于人类来说很难的事情,对机器来说很简单。 1.2.1. …

Extension Eslint is configured as formatter but it cannot format TypeScript-files.

应该是Eslint报错了。 到OUTPUT面板查看Eslint的输出信息。

SpringMVC-04-结果跳转及数据处理

1、结果跳转 SpringMVC中有两种实现 Handler 的方式:接口实现 和 注解实现, 两种方式对请求结果的处理各有不同。 1.1、接口Handler处理结果 public class ControllerTest implements Controller {@Overridepublic ModelAndView handleRequest(HttpServletRequest request, H…

SciTech-EECS-电路设计- PCB设计-PCB设计流程 + 元器件封装设计 + PCB设计规则 +PCB布局/布线/覆铜等设计

PCB(印刷电路板)设计, 是以"电路原理图"为根据实现电路设计者所需要的功能。 "PCB设计"主要指"版图设计", 需要考虑:"外部Connections(连接)"的布局, "内部Components(电子元器件)的优化布局, "金属连线" 和 "Via…

全网最适合入门的面向对象编程教程:19 类和对象的 Python 实现-使用 PyCharm 自动生成文件注释和函数注释

本文主要介绍了在使用Python的IDE-PyCharm时,如何在新建文件时自动添加文件注释的方法,同时对PyCharm中生成函数注释的方法进行了简单介绍。全网最适合入门的面向对象编程教程:19 类和对象的 Python 实现-使用 PyCharm 自动生成文件注释和函数注释 摘要: 本文主要介绍了在使…

spring email 发送功能

邮件通知是现代应用中常见的一种通信方式,特别是在需要及时反馈、告警或重要事件通知的场景下。Spring Boot提供了简单而强大的邮件发送功能,本文将通过pring Boot中使用JavaMailSender 接口实现邮件发送。使用场景说明注册验证:在用户注册、商户注册时,通过邮件发送验证码…

T240718(辐角函数连续性)

复变函数辐角函数的连续性[T240718] 证明复变函数 \(\arg z ~(-\pi<\arg z\le \pi)\) 在负实轴上 (包括原点) 不连续, 除此之外在 \(z\) 平面上处处连续. 证:当 \(z=0\) 时, \(\arg z\) 无意义, 自然不连续. 在负实轴上任取一点 \(z_0\), 当 \(z\) 从上半平面趋于 \(z_0\) …

缺陷和缺陷报告

一、缺陷的基本概述1、缺陷的定义 软件未实现产品说明书要求的功能软件出现了产品说明书指明不应该出现的功能软件实现了产品说明书未提到的功能软件未实现产品说明书虽未明确提及在应该实现的目标软件难以理解、不易使用、运行缓慢或者(从测试的角度看)最终用户会认为不好 2…