Golang rxgo库

185 阅读1分钟

好文推荐

darjun.github.io/2020/10/11/…

关键总结

可以类比Java Stream流式编程Observable就好比Stream

两张重要的图告诉你如何使用rxgo:

每个方法都会返回一个channel,然后别人可以消费这个channel

image.png

如下是FlatMap的用法(可类比Java Stream的flatMap): image.png

FlatMap就是将一个流中的每个元素都映射成另一个流,并且将所有的流都合并进行扁平化处理

示例代码

简单示例:

func main() {
   observable := rxgo.Just(1, 2, 3, 4, 5)()
   ch := observable.Observe()
   for item := range ch {
      fmt.Println(item.V)
   }
}

FromChannel可以直接从一个已存在的<-chan rxgo.Item对象中创建 Observable

func main() {
   ch := make(chan rxgo.Item)
   go func() {
      for i := 1; i <= 5; i++ {
         ch <- rxgo.Of(i)
      }
      close(ch)
   }()

   observable := rxgo.FromChannel(ch)
   for item := range observable.Observe() {
      fmt.Println(item.V)
   }
}

也可以使用Create方法:

// Create creates an Observable from scratch by calling observer methods programmatically.
func Create(f []Producer, opts ...Option) Observable {
   return &ObservableImpl{
      iterable: newCreateIterable(f, opts...),
   }
}

传入一个[]rxgo.Producer的切片,其中rxgo.Producer的类型为func(ctx context.Context, next chan<- Item)。我们可以在代码中调用rxgo.Of(value)生成数据,rxgo.Error(err)生成错误,然后发送到next通道中:

func main() {
  observable := rxgo.Create([]rxgo.Producer{func(ctx context.Context, next chan<- rxgo.Item) {
    next <- rxgo.Of(1)
    next <- rxgo.Of(2)
    next <- rxgo.Of(3)
    next <- rxgo.Error(errors.New("unknown"))
    next <- rxgo.Of(4)
    next <- rxgo.Of(5)
  }})

  ch := observable.Observe()
  for item := range ch {
    if item.Error() {
      fmt.Println("error:", item.E)
    } else {
      fmt.Println(item.V)
    }
  }
}

分成2个rxgo.Producer也是一样的效果:

observable := rxgo.Create([]rxgo.Producer{func(ctx context.Context, next chan<- rxgo.Item) {
  next <- rxgo.Of(1)
  next <- rxgo.Of(2)
  next <- rxgo.Of(3)
  next <- rxgo.Error(errors.New("unknown"))
  }, func(ctx context.Context, next chan<- rxgo.Item) {
  next <- rxgo.Of(4)
  next <- rxgo.Of(5)
}})