当前位置: 首页 > 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的方…...

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑:陈萍萍的公主一点人工一点智能 未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战,在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…...

HTML 语义化

目录 HTML 语义化HTML5 新特性HTML 语义化的好处语义化标签的使用场景最佳实践 HTML 语义化 HTML5 新特性 标准答案&#xff1a; 语义化标签&#xff1a; <header>&#xff1a;页头<nav>&#xff1a;导航<main>&#xff1a;主要内容<article>&#x…...

日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする

日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする 1、前言(1)情况说明(2)工程师的信仰2、知识点(1) にする1,接续:名词+にする2,接续:疑问词+にする3,(A)は(B)にする。(2)復習:(1)复习句子(2)ために & ように(3)そう(4)にする3、…...

dedecms 织梦自定义表单留言增加ajax验证码功能

增加ajax功能模块&#xff0c;用户不点击提交按钮&#xff0c;只要输入框失去焦点&#xff0c;就会提前提示验证码是否正确。 一&#xff0c;模板上增加验证码 <input name"vdcode"id"vdcode" placeholder"请输入验证码" type"text&quo…...

Qwen3-Embedding-0.6B深度解析:多语言语义检索的轻量级利器

第一章 引言&#xff1a;语义表示的新时代挑战与Qwen3的破局之路 1.1 文本嵌入的核心价值与技术演进 在人工智能领域&#xff0c;文本嵌入技术如同连接自然语言与机器理解的“神经突触”——它将人类语言转化为计算机可计算的语义向量&#xff0c;支撑着搜索引擎、推荐系统、…...

高等数学(下)题型笔记(八)空间解析几何与向量代数

目录 0 前言 1 向量的点乘 1.1 基本公式 1.2 例题 2 向量的叉乘 2.1 基础知识 2.2 例题 3 空间平面方程 3.1 基础知识 3.2 例题 4 空间直线方程 4.1 基础知识 4.2 例题 5 旋转曲面及其方程 5.1 基础知识 5.2 例题 6 空间曲面的法线与切平面 6.1 基础知识 6.2…...

C++ 求圆面积的程序(Program to find area of a circle)

给定半径r&#xff0c;求圆的面积。圆的面积应精确到小数点后5位。 例子&#xff1a; 输入&#xff1a;r 5 输出&#xff1a;78.53982 解释&#xff1a;由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982&#xff0c;因为我们只保留小数点后 5 位数字。 输…...

JDK 17 新特性

#JDK 17 新特性 /**************** 文本块 *****************/ python/scala中早就支持&#xff0c;不稀奇 String json “”" { “name”: “Java”, “version”: 17 } “”"; /**************** Switch 语句 -> 表达式 *****************/ 挺好的&#xff…...

4. TypeScript 类型推断与类型组合

一、类型推断 (一) 什么是类型推断 TypeScript 的类型推断会根据变量、函数返回值、对象和数组的赋值和使用方式&#xff0c;自动确定它们的类型。 这一特性减少了显式类型注解的需要&#xff0c;在保持类型安全的同时简化了代码。通过分析上下文和初始值&#xff0c;TypeSc…...

MySQL:分区的基本使用

目录 一、什么是分区二、有什么作用三、分类四、创建分区五、删除分区 一、什么是分区 MySQL 分区&#xff08;Partitioning&#xff09;是一种将单张表的数据逻辑上拆分成多个物理部分的技术。这些物理部分&#xff08;分区&#xff09;可以独立存储、管理和优化&#xff0c;…...