关于 go-linq 和 RxGo, 做数据统计还是 go-linq 方便一点
这两个库都不错, 开发活跃, 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: %vn", i.V) } }
RxJava 和 RxJs 等还是直接根据一个属性分组, go-linq 也是如此, 这一点感觉不太喜欢.
RxGo 是基于流处理, 不提供直接的排序函数, 需要自己去扩展.
RxGo 有完善的错误处理机制, go-linq 缺, 但也因此, 对过程和结果处理显得繁琐,
在纯粹的数据集统计上 go-linq 要更方便一点, 函数的使用更便捷一点, 保证数据集合的严谨前提下, 使用 go-linq 足够.
RxGo 可以应用到更复杂的场景去.