「GoCN酷Go推荐」基于泛型的 Golang lodash 库 — samber/lo
近日,Go 核心开发团队终于宣布了 Go 1.18 正式版本的发布!这是一个大家期待很久的版本!Go 1.18 包含大量新功能:模糊测试、性能改进、工作区等,以及 Go 语言开源以来最大的一次语法特性变更 —— 支持泛型!
支持泛型后,我们便不再需要写如下冗余的代码:
现在只需要简单的一行即可:
func Min[T constraints.Ordered](a, b T) T { if a < b { return a }; return b}
lodash
在 JavaScript 的世界里,lodash.js
是一个一致性、模块化、高性能的 JavaScript 实用工具库,其通过降低 array、number、objects、string 等等的使用难度让 JavaScript 变得更简单。并且其不需要引入其他第三方依赖。
我们可以直接调用其中封装好的方法,比如数组去重,防抖函数等等,简化很多代码。
比如去重:
import _ from 'lodash'
_.uniq([2, 1, 2]);
// => [2, 1]
比如过滤掉数组中不符合规则的元素:
var users = [{ 'user': 'barney', 'age': 36, 'active': true },{ 'user': 'fred', 'age': 40, 'active': false }
];_.filter(users, function(o) { return !o.active; });
// => objects for ['fred']// The `_.matches` iteratee shorthand.
_.filter(users, { 'age': 36, 'active': true });
// => objects for ['barney']
somber/lo
在 Golang 支持泛型之前,实现像 lodash.js
这样一套适配多种数据类型的完整的工具库是非常不容易的。有一些开源库通过其他方式实现了部分功能,大致有三种方案:
纯手撸 - 毫无疑问,这种方式是最不优雅的,需要对每种类型进行开发,需要做很多无聊的工作。
代码生成 - 通过脚本辅助生成针对不同类型的工具函数,比如 go-dash/slice。
使用反射 - 这种方式可以实现目的,但是反射会带来较大复杂度和造成运行时性能的下降。go-funk 和robpike/filter都是通过该种方式实现的工具库。
somber/lo
是一个基于 Golang 泛型实现的的 lodash 风格工具库,比较好的避免了上面的问题。
somber/lo
包含了非常多的方法,主要可以划分为以下几类:
slice 辅助方法
map 辅助方法
tuples 辅助方法
多个集合之间计算辅助方法
搜索查询辅助方法
其他函数式编程辅助方法等
以切片去重举例:
names := lo.Uniq[string]([]string{"Samuel", "Marc", "Samuel"})
// []string{"Samuel", "Marc"}
调用非常简单,并且在大多数情况下,我们可以省略类型的指定:
names := lo.Uniq([]string{"Samuel", "Marc", "Samuel"})
// []string{"Samuel", "Marc"}
再比如过滤掉切片中不符合规则的元素:
even := lo.Filter([]int{1, 2, 3, 4}, func(x int, _ int) bool {return x%2 == 0
})
// []int{2, 4}
Summary
somber/lo
基于泛型包装了非常多的工具方法,可以大大节省我们的开发时间,避免重复开发,提升效率。但是该库开源至今才两周,可能会有一些问题缺陷存在其中,线上使用还需要谨慎一些。
Reference
Go 1.18 is released! - The Go Programming Language
The benefits of using Lodash in the Go language without reflection (freecodecamp.org)
samber/lo:
「GoCN酷Go推荐」基于泛型的 Golang lodash 库 — samber/lo相关推荐
- 「GoCN酷Go推荐」后现代时代远程办公网络问题的golang开源解决方案 —— PairMesh...
PairMesh是什么? Pairmesh是一款先进的虚拟局域网(VPN)工具,用来搭建与访问安全,易用,高性能的点对点的软件定义虚拟局域网,为远程办公的网络连接问题提供了开箱即用的解决方案. 拥抱开 ...
- 「GoCN酷Go推荐」漏桶限流库 — uber-go/ratelimit
上次有同学分享了 单机限流器 time/rate 库,讲了 Golang 标准库中基于令牌桶实现限流组件的 time/rate 使用,同时也讲了一些限流算法原理. 这里分享一个 uber 开源的一套基 ...
- 「GoCN酷Go推荐」Go 语言高性能图像处理神器 h2non/bimg
0 推荐背景 日常业务开发中常会遇到各种图像处理需求,如,图片大小调整.翻转.旋转.提取大小.加水印.图片模糊化,格式转换,修剪等等:图像处理根据业务需求一部分图像处理需求在前端完成,如,用户裁剪编辑 ...
- 「GoCN酷Go推荐」使用 cmux 实现服务端连接多路复用
如果一个应用需要同时对外提供 HTTP 和 gRPC 服务,通常情况下我们会为两个服务绑定不同的监听端口,而本文要介绍的 cmux 为我们提供了一种连接多路复用的新选择,使用 cmux 可以将不同服务 ...
- 「GoCN酷Go推荐」QQ机器人 go-cqhttp
什么是 go-cqhttp?✦ QQ机器人,可以做的事儿太多了,比如一个UP主需要群发多个QQ群,以便通知粉丝们开播:再比如可以检测群内或发给自己的消息,而通过代码直接回复做的简单回复.比如检测群内有 ...
- 「GoCN酷Go推荐」go语言位操作库 — bitset
bitset库实现了bitsets数据结构,这是一种正整数和布尔值映射关系的结构,它比map[uint]bool更高效 什么是bitsets✦ bitsets基本思想是用一个bit位来标记某个元素对应 ...
- 「GoCN酷Go推荐」高性能内存缓存 ristretto
背景 ristretto 是 dgraph 团队开源的一款高性能内存缓存库,旨在解决高并发场景下的缓存性能和吞吐瓶颈.dgraph 专攻的方向是高性能图数据库,ristretto 就是其图数据库和 K ...
- 「GoCN酷Go推荐」快速搭建私有云服务 go-btfs
# 1. go-btfs 是什么?# go-btfs 是一个去中心化的文件存储平台,无论图片.文件.视频等等各类文件.每个人都可以在自己电脑上安装部署 BTFS 节点,然后大家的节点相互连接,构成一个 ...
- 「GoCN酷Go推荐」JSON 数据获取器 JID
01 推荐理由 JSON 格式数据适用范围非常广泛,一个内容丰富的json数据可能很大,使用 JID 可以让你非常舒服的获取到想要到数据. 02 简介 JID 是一个过滤JSON格式数据 cli ...
最新文章
- 「linux」win+linux 双系统 默认启动项 的修改
- Windows8.1 64bit环境下搭建深度学习平台之CUDA安装与配置
- linuxliveu盘怎么用_U盘数据如何恢复?U盘打不开怎么办?
- 三年级计算机画图,三年级面积作图题_小学三年级要求画图
- Maven的一些资源(配置方法、idea中toggle offline mode:切换脱机模式、idea中Toggle ‘Skip Tests’ Mode、 Dependencies 出现红色波浪线)
- C# 代码生成器 (存储过程生成方法)
- 2014 Super Training #2 F The Bridges of Kolsberg --DP
- ajax请求后台php数据时查看报错parse error
- 奶制品的生产lingo软件编辑
- 难得有一篇文章来仔细梳理cowboy bebop的种种.
- BlockUI详细用法
- 线性时变模型预测控制推导
- Python控制仪器【2 ,控制矢量网络分析仪】
- 无代码动态数据可视化大屏
- Python常用音频库
- webstorm汉化怎样切回英文_我不小心把NS切成英文/日文系统了,怎样回到中文系统?...
- IR(红外遥控)基本原理
- Web Uploader文件(图片)上传使用方法
- Python爬虫——Scrapy Spiders
- 小米2A com.android.phone,104.android 简单的检查小米手机系统和华为手机系统是否打开通话自动录音功能,跳转通话录音页面...