欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

是时候考虑替换samber/lo来代替ahmetb/go-linq了

最编程 2024-08-10 17:13:31
...

[

Che Dan

](medium.com/@dche423?so…)

车丹

关注

6月29日

-

3分钟阅读

[

拯救

](medium.com/m/signin?ac…)

是时候用samber/lo取代ahmetb/go-linq了

在使用Golang工作时,我们经常需要操作一个数据集合。比如过滤、映射、求和等等。

虽然这些操作大多可以用简单的 "for looping "来完成,但这是相当乏味的,我们更愿意避免这样做。

在Golang1.18之前,我们通过以下方式来完成工作 ahmetb/go-linq.

在Golang1.18发布后,由于语言中加入了内置的泛型支持。 samber/lo成为了一个更好的选择。

关于ahmetb/go-linq

LINQ(语言集成查询)是一个来自C#的概念,ahmetb/go-linq 借用了这个概念,在golang中重新实现了它。作为一个库,LINQ帮助我们提高开发性能。

注意:这是 "开发性能",而不是 "运行时性能"。

由于缺乏对golang的泛型支持,linq选择了反射来支持所有类型的分片。这就注定了linq的效率不高。

根据作者(ahmetb)的反馈,linq不会升级到利用golang的内置泛型。

Linq为每个方法提供了两个版本。

一个版本使用interface{} 作为参数,用户在使用过程中必须将其转换为实际的类型。

另一个版本在类型上更安全,是Linq作者推荐的。但是它有一个代价--类型安全的版本要慢得多。

Linq有一个可连锁的API,这使得使用它成为一种乐趣。

在golang1.18之前,linq是最好的选择。

关于samber/lo

引自其主页。

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

lo的概念来自于著名的JavaScript库 lodash.它是100%类型安全的,并且有更好的性能。编译时的检查将帮助我们避免大多数错字。所有这些好处从根本上说都是来自golang的泛型。

如果你查看lolinq的源代码,你会发现lo的源代码要比linq简单得多。这意味着维护和改进lo将明显比linq容易。

唯一的遗憾是lo没有提供可连锁的API,因为它没有引入一个额外的抽象层。

并排比较

接下来,我将选择几个常见的场景,并相应地用lo/linq/for-looping实现三次函数。通过这些例子,你会明白如何用不同的方法实现相同的目标。

以下是这些场景。

  • Uniq,从一个int slice中返回唯一的元素
  • 过滤,仅当元素的模数为13时才从int slice中返回元素
  • Map, 将所有元素从一个int slice转移到一个string slice中。

如上面的源代码所示,lo可以提供最清晰和最简单的解决方案。

基准测试

让我们对所有的函数进行基准测试。下面是对一个包含10000个元素的int slice进行基准测试的结果。

显然,lo和 "for-loop "函数具有相似的性能,而且它们远远优于linq

  • 就速度而言,lolinq快4-80倍
  • 至于内存分配,在某些情况下,lolinq好10000倍。

基准测试结果

结论

尽管我们上面的例子场景并不完整,但不难得出结论。

  • lo可以提供一个更简单的解决方案来实现业务逻辑
  • lo可以提供更好的编译时检查
  • lo的性能要好得多
  • 在golang1.18发布后用lo取代linq可能是一个明智的决定。

上一篇: C# LINQ初探

下一篇: C# 简介 |

推荐阅读