当前位置: 首页 > news >正文

Go语言函数式编程库samber/lo

Go语言函数式编程库samber/lo

开发中,我们经常遇到一些操作,比如获取一个map的所有key,所有value,判断一个字符串是否出现在slice

中,slice中是否有重复元素等等。Go语言没有这样的操作,标准库也不提供。因此我们自己,或者团队会维护一

些这类操作的包。得益于Go泛型的发布,lo 就是这样的包,封装了大量简单操作,可以降低我们的代码量。

samber/lo 是一个基于Go 1.18+泛型的Lodash风格的Go库。

samber/lo文档地址:https://pkg.go.dev/github.com/samber/lo

samber/lo GitHub地址:https://github.com/samber/lo

除了 lo,Go官方也提供了一些实验性的包,比如 golang.org/x/exp/mapgolang.org/x/exp/slices 。这些包

针对特定的数据结构,更小,引入项目时更灵活,并且可能成为标准库的一部分,而 lo 则更全面。

1、安装

$ go get github.com/samber/lo@v1

2、简单使用

package mainimport ("fmt""github.com/samber/lo"
)func main(){names := lo.Uniq[string]([]string{"Samuel", "John", "Samuel"})// 2fmt.Println(len(names))// [Samuel John]fmt.Println(names)
}

我们可以导入所有的函数:

package mainimport ("fmt". "github.com/samber/lo"
)func main() {names := Uniq[string]([]string{"Samuel", "John", "Samuel"})// 2fmt.Println(len(names))// [Samuel John]fmt.Println(names)
}

3、部分功能介绍

3.1 Filter

根据条件对集合中的元素进行筛选。

package mainimport ("fmt""github.com/samber/lo"
)func main() {list := []int64{1, 2, 3, 4}// 返回可以被2整除的元素result := lo.Filter(list, func(nbr int64, index int) bool {return nbr%2 == 0})// [2 4]fmt.Printf("%v", result)
}

3.2 Map

遍历集合中的每一个元素并对集合中的每一个元素进行相同的操作。

package mainimport ("fmt""github.com/samber/lo"
)func main() {list := []int64{1, 2, 3, 4}// 集合的每个元素都乘以10result := lo.Map(list, func(x int64, index int) string {return fmt.Sprintf("%d", x*10)})// [10 20 30 40]fmt.Println(result)
}

并行处理:

package mainimport ("fmt"lop "github.com/samber/lo/parallel"
)func main() {list := []int64{1, 2, 3, 4}// 集合的每个元素都乘以10result := lop.Map(list, func(x int64, index int) string {return fmt.Sprintf("%d", x*10)})// [10 20 30 40]fmt.Println(result)
}

3.3 FilterMap

先根据条件对集合中的元素进行筛选。

然后遍历集合中的每一个元素并对集合中的每一个元素进行相同的操作。

package mainimport ("fmt""github.com/samber/lo"
)func main() {list := []int64{1, 2, 3, 4}// 先返回可以被2整除的元素,然后集合的每个元素都乘以10result := lo.FilterMap(list, func(nbr int64, index int) (string, bool) {return fmt.Sprintf("%d", nbr*10), nbr%2 == 0})// [20 40]fmt.Printf("%v", result)
}

3.4 Range/RangeFrom/RangeWithSteps

创建一个从开始到结束(不包括结束)的数字数组(正数和/或负数)。

package mainimport ("fmt""github.com/samber/lo"
)func main() {// [0 1 2 3]result1 := lo.Range(4)// [0 -1 -2 -3]result2 := lo.Range(-4)// [1 2 3 4 5]result3 := lo.RangeFrom(1, 5)// [1 2 3 4 5]result4 := lo.RangeFrom(1.0, 5)// [0 5 10 15]result5 := lo.RangeWithSteps(0, 20, 5)// [-1 -2 -3]result6 := lo.RangeWithSteps[float32](-1.0, -4.0, -1.0)// []result7 := lo.RangeWithSteps(1, 4, -1)// []result8 := lo.Range(0)fmt.Printf("%v\n", result1)fmt.Printf("%v\n", result2)fmt.Printf("%v\n", result3)fmt.Printf("%v\n", result4)fmt.Printf("%v\n", result5)fmt.Printf("%v\n", result6)fmt.Printf("%v\n", result7)fmt.Printf("%v\n", result8)
}

3.5 RandomString

返回指定长度的随机字符串,该字符串由指定的字符集组成。

package mainimport ("fmt""github.com/samber/lo"
)func main() {result := lo.RandomString(5, lo.LettersCharset)// XVlBzfmt.Printf("%v", result)
}

3.6 IsNotEmpty

如果参数为零值,则返回true。

package mainimport ("fmt""github.com/samber/lo"
)func main(){// falsefmt.Println(lo.IsNotEmpty(0))// truefmt.Println(lo.IsNotEmpty(42))// falsefmt.Println(lo.IsNotEmpty(""))// truefmt.Println(lo.IsNotEmpty("foobar"))type test struct {foobar string}// falsefmt.Println(lo.IsNotEmpty(test{foobar: ""}))// truefmt.Println(lo.IsNotEmpty(test{foobar: "foobar"}))
}

这里只是用举几个例子,lo 中支持超多的转化帮助函数供开发使用,如果有需要可以参考开发文档。

相关文章:

Go语言函数式编程库samber/lo

Go语言函数式编程库samber/lo 开发中,我们经常遇到一些操作,比如获取一个map的所有key,所有value,判断一个字符串是否出现在slice 中,slice中是否有重复元素等等。Go语言没有这样的操作,标准库也不提供。…...

自定义杰理AC63系列BLE数据发送函数

自定义BLE数据发送函数,就是将数据发送、数据发送前的检查、以及conn_handle查询等封装在一起,脱离SDK中的相关回调函数,在程序任意位置实现发送数据功能。 1. SDK中的BLE数据发送函数 BLE的数据发送函数定义在apps\common\third_party_pro…...

Jenkins结合gitee自动化部署SpringBoot项目

安装 安装教程 插件选择 Gitee Plugin 配置 源码管理 填写源码地址 注意:请确保genkins所在的服务器有权限git拉取远程仓库代码,如果不可以请参考ssh配置centos 配置ssh拉取远程git代码 源码管理 构建触发器 1.勾选Gitee webhook 触发构建 2.生成we…...

声强级和声压级之间的转换举例

声强级和声压级之间的转换举例 在学习声学时候,经常会遇到声强级和声压级的概念,而且它们的单位都是分贝(dB),很容易混淆这两个概念。而且,更容易在计算时候,不知如何转换,如何使用,本文将举例说明两者之间…...

16 粒子滤波

文章目录 16 粒子滤波16.1 背景介绍16.1.1 Particle Filter是什么?16.1.2 Patricle Filter的状态如何转移?16.1.3 如何通过采样求解Particle Filter 16.2 重要性采样16.2.1 重要性采样方法16.2.2 Sequential Importance Sampling16.2.3 Resampling16.2.4…...

【appium】appium自动化入门之API(下)——两万字API长文,建议收藏

目录 Appium API 前言 1.contexts (返回当前会话中的上下文,使用后可以识别 H5 页面的控件) 2.current_context (返回当前会话的当前上下文 ) 3. context (返回当前会话的当前上下文) 4.find_e…...

开发改了接口,经常忘通知测试的解决方案!

目录 前言: Apifox解决方案 Apifox对此给出的解决方案是: 用Apifox怎么处理接口变更 接口代码实现逻辑修改 接口参数修改 前言: 在开发过程中,接口变动十分频繁,测试人员没有及时获得相关通知的情况也很普遍。这…...

Beyond Compare 4 无法打开

解决办法: 1.修改注册表。WINR呼出开始菜单,在搜索栏中输入 regedit,点击确定。 2.删除项目:\HKEY_CURRENT_USER\Software\ScooterSoftware\Beyond Compare 4\CacheId 根据这个路径找到cacheid 右击删除掉就可以...

MySQL高级数据操作

✅作者简介:热爱Java后端开发的一名学习者,大家可以跟我一起讨论各种问题喔。 🍎个人主页:Hhzzy99 🍊个人信条:坚持就是胜利! 💞当前专栏:MySQL 🥭本文内容&a…...

硬件设计电源系列文章-DCDC转换器基础知识

文章目录 概要整体架构流程技术名词解释技术细节小结 概要 提示:这里可以添加技术概要 本文主要接着上篇,上篇文章主要讲述了LDO的相关基础知识,本节开始分享DCDC基础知识 整体架构流程 提示:这里可以添加技术整体架构 以下是…...

XdsObjects .NET 8.45.1001.0 Crack

XdsObjects 是一个工具包,允许开发人员使用 IHE XDS 和 XDS-I 配置文件开发应用程序,只需花费最少的时间和精力,因为遵守配置文件和 ebXML 规则的所有艰苦工作都由该工具包处理。 它为所有角色提供客户端和服务器支持,包括&#…...

数据安全--17--数据安全管理之数据传输

本博客地址:https://security.blog.csdn.net/article/details/131061729 一、数据传输概述 数据传输有两个主体,一个是数据发送方,另一个是数据接收方。数据在通过不可信或者较低安全性的网络进行传输时,容易发生数据被窃取、伪…...

SpringSecurity实现前后端分离登录token认证详解

目录 1. SpringSecurity概述 1.1 权限框架 1.1.1 Apache Shiro 1.1.2 SpringSecurity 1.1.3 权限框架的选择 1.2 授权和认证 1.3 SpringSecurity的功能 2.SpringSecurity 实战 2.1 引入SpringSecurity 2.2 认证 2.2.1 登录校验流程 2.2.2 SpringSecurity完整流程 2.2.…...

Vue3_ElementPlus_简单增删改查(2023)

Vue3,Element Plus简单增删改查 代码:https://github.com/xiaoming12318/Vue3_ElementPlus_CRUD.git 环境: Visual Studio Code Node.js 16.0或更高版本,https://nodejs.org/en axios 快速上手: 如果已经有16.0及…...

vue中重写并自定义console.log

0. 背景 在vue2项目中自定义console.log并输出文件名及行、列号 1. 实现 1.1 自定义console.log export default {// 输出等级: 0-no, 1-error, 2-warning, 3-info, 4-debug, 5-loglevel: 5,// 输出模式: 0-default, 1-normal, 2-randommode: 1,// 是否输出图标hasIcon: fal…...

基于OpenCV 和 Dlib 进行头部姿态估计

写在前面 工作中遇到,简单整理博文内容涉及基于 OpenCV 和 Dlib头部姿态评估的简单Demo理解不足小伙伴帮忙指正 庐山烟雨浙江潮,未到千般恨不消。到得还来别无事,庐山烟雨浙江潮。 ----《庐山烟雨浙江潮》苏轼 https://github.com/LIRUILONGS…...

24个Jvm面试题总结及答案

1.什么是Java虚拟机?为什么Java被称作是“平台无关的编程语言”? Java虚拟机是一个可以执行Java字节码的虚拟机进程。Java源文件被编译成能被Java虚拟机执行的字节码文件。 Java被设计成允许应用程序可以运行在任意的平台,而不需要程序员为每…...

freemarker 生成前端文件

Freemarker是一种模板引擎,它允许我们在Java应用程序中分离视图和业务逻辑。在Freemarker中,List是一种非常有用的数据结构,它允许我们存储一组有序的元素。有时候,我们需要判断一个List是否为空,这在程序设计中有许多…...

Pycharm+pytest+allure打造高逼格的测试报告

目录 前言: 1、安装allure 2、安装allure-pytest 3、一个简单的用例test_simpe.py 4、在pycharm底部打开terminal 5、用allure美化报告 6、查看报告 总结: 前言: 今天分享的内容:在Pycharmpytest基础上使用allure打造高逼格…...

Mybatis-Plus中update更新操作用法

目录 一、前言二、update1、关于修改的4个条件构造器2、UpdateWrapper【用法示例】3、LambdaUpdateWrapper【用法示例】4、UpdateChainWrapper【 用法示例】5、LambdaUpdateChainWrapper【 用法示例】6、updateById 和 updateBatchById7、Mybatis-plus设置某个字段值为null的方…...

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…...

【OSG学习笔记】Day 18: 碰撞检测与物理交互

物理引擎(Physics Engine) 物理引擎 是一种通过计算机模拟物理规律(如力学、碰撞、重力、流体动力学等)的软件工具或库。 它的核心目标是在虚拟环境中逼真地模拟物体的运动和交互,广泛应用于 游戏开发、动画制作、虚…...

(二)TensorRT-LLM | 模型导出(v0.20.0rc3)

0. 概述 上一节 对安装和使用有个基本介绍。根据这个 issue 的描述,后续 TensorRT-LLM 团队可能更专注于更新和维护 pytorch backend。但 tensorrt backend 作为先前一直开发的工作,其中包含了大量可以学习的地方。本文主要看看它导出模型的部分&#x…...

深入理解JavaScript设计模式之单例模式

目录 什么是单例模式为什么需要单例模式常见应用场景包括 单例模式实现透明单例模式实现不透明单例模式用代理实现单例模式javaScript中的单例模式使用命名空间使用闭包封装私有变量 惰性单例通用的惰性单例 结语 什么是单例模式 单例模式(Singleton Pattern&#…...

HTML前端开发:JavaScript 常用事件详解

作为前端开发的核心,JavaScript 事件是用户与网页交互的基础。以下是常见事件的详细说明和用法示例: 1. onclick - 点击事件 当元素被单击时触发(左键点击) button.onclick function() {alert("按钮被点击了!&…...

Linux --进程控制

本文从以下五个方面来初步认识进程控制: 目录 进程创建 进程终止 进程等待 进程替换 模拟实现一个微型shell 进程创建 在Linux系统中我们可以在一个进程使用系统调用fork()来创建子进程,创建出来的进程就是子进程,原来的进程为父进程。…...

以光量子为例,详解量子获取方式

光量子技术获取量子比特可在室温下进行。该方式有望通过与名为硅光子学(silicon photonics)的光波导(optical waveguide)芯片制造技术和光纤等光通信技术相结合来实现量子计算机。量子力学中,光既是波又是粒子。光子本…...

【JVM】Java虚拟机(二)——垃圾回收

目录 一、如何判断对象可以回收 (一)引用计数法 (二)可达性分析算法 二、垃圾回收算法 (一)标记清除 (二)标记整理 (三)复制 (四&#xff…...

R 语言科研绘图第 55 期 --- 网络图-聚类

在发表科研论文的过程中,科研绘图是必不可少的,一张好看的图形会是文章很大的加分项。 为了便于使用,本系列文章介绍的所有绘图都已收录到了 sciRplot 项目中,获取方式: R 语言科研绘图模板 --- sciRplothttps://mp.…...

从面试角度回答Android中ContentProvider启动原理

Android中ContentProvider原理的面试角度解析,分为​​已启动​​和​​未启动​​两种场景: 一、ContentProvider已启动的情况 1. ​​核心流程​​ ​​触发条件​​:当其他组件(如Activity、Service)通过ContentR…...