Golang Go语言中关于go-linq和RxGo,做数据统计哪个更方便一点

发布于 1周前 作者 gougou168 来自 Go语言

Golang Go语言中关于go-linq和RxGo,做数据统计哪个更方便一点

这两个库都不错, 开发活跃, go-linq 来自 Google 员工, RxGo 来自 ReactiveX 官方, 背景都不错.

ReactiveX 算是 linq 的扩展, RxGo 的覆盖场景要更广泛一点, 扩展性更强, 并发的使用也很便捷, 当然复杂性也增加了不少,

RxGo 的 GroupBY 设计的很奇怪, 分组的 KEY 和分组的数量还要另外计算:

	type Cat struct {
		Name  string
		Value string
	}
	items := []Cat{
		{Name: "a", Value: "asdf"},
		{Name: "a", Value: "sdf432"},
		{Name: "b", Value: "sdf342"},
		{Name: "b", Value: "vvvv"},
		{Name: "c", Value: "ccc"},
	}
	keys, _ := rxgo.Just(items)().Map(func(_ context.Context, i interface{}) (interface{}, error) {
		return i.(Cat).Name, nil
	}).Distinct(func(_ context.Context, i interface{}) (interface{}, error) {
		return i, nil
	}).ToSlice(0)
list := &arraylist.List{}
list.Add(keys...)

observable := rxgo.Just(items)().GroupBy(len(keys), func(item rxgo.Item) int {
	return list.IndexOf(item.V.(Cat).Name)
}, rxgo.WithBufferedChannel(5))

for i := range observable.Observe() {
	fmt.Println("New observable:")

	for i := range i.V.(rxgo.Observable).Observe() {
		fmt.Printf("item: %v\n", i.V)
	}
}

RxJava 和 RxJs 等还是直接根据一个属性分组, go-linq 也是如此, 这一点感觉不太喜欢.

RxGo 是基于流处理, 不提供直接的排序函数, 需要自己去扩展.

RxGo 有完善的错误处理机制, go-linq 缺, 但也因此, 对过程和结果处理显得繁琐,

在纯粹的数据集统计上 go-linq 要更方便一点, 函数的使用更便捷一点, 保证数据集合的严谨前提下, 使用 go-linq 足够.

RxGo 可以应用到更复杂的场景去.


更多关于Golang Go语言中关于go-linq和RxGo,做数据统计哪个更方便一点的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html

7 回复

没有范性都太丑了 等着出来了在玩

更多关于Golang Go语言中关于go-linq和RxGo,做数据统计哪个更方便一点的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


如果你要好看 go-linq 有伪泛型, 比真正的泛型还好看, 性能减弱 5-10 倍(仍然可以接受, 比 python 还是快很多对吧)

squares := []int{}

Range(1, 10).SelectT(func(x int) int { return x * x } ). ToSlice(&squares)


go-linq 非泛型

squares := []int{}

Range(1, 10).Select( func(x interface{}) interface{} { return x.(int) * x.(int) } ).ToSlice(&squares)

linq 的场景, 对泛型确实很期待, 超大数据集, 应该提升不止 10 倍性能

squares := []int{}

Range(1, 10).SelectT(func(type int)(x int) int { return x * x } ). ToSlice(&squares)

数据放不进内存当场歇菜,10 倍性能是脑补的么

仅针对内存中处理的数据集而言

就算是分布式 map reduce,节点不都是在内存中处理部分数据集吗

在Golang中,go-linq和RxGo都是强大的数据处理工具,但在数据统计方面,两者各有千秋。

go-linq是一个为Go语言设计的语言集成查询(LINQ)库,它提供了类似于.NET LINQ的查询体验,极大地简化了数据操作和查询的复杂性。go-linq支持懒惰评估、并发安全,并引入了泛型函数,使得代码更加简洁。在数据统计方面,go-linq可以通过链式方法调用轻松实现数据筛选、转换和聚合,非常适合处理复杂的数据查询和统计任务。

RxGo则是一个实现响应式编程的库,它允许你以声明式的方式处理异步数据流。RxGo提供了丰富的操作符来处理数据流,如过滤、映射、聚合等。虽然RxGo在数据统计方面同样强大,但其更侧重于处理异步数据流和事件,对于静态数据的统计可能稍显繁琐。

综上所述,如果你需要处理复杂的数据查询和统计任务,且数据以静态或同步方式提供,go-linq可能更加方便。而如果你需要处理异步数据流或事件,并希望以声明式方式处理这些数据,RxGo则是一个不错的选择。在选择时,请根据你的具体需求和项目特点进行权衡。

回到顶部