Golangrxgo库的具体使用

作者:

文章目录
  • 可以类比Java Stream流式编程,Observable就好比Stream。 两张重要的图告诉你如何使用rxgo: 每个方法都会返回一个channel,然后别人可以消费这个channel 如下是FlatMap的用法(可类比Java Stream的flatMap): 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) }}) 到此这篇关于Golang rxgo库的具体使用的文章就介绍到这了,更多相关Golang rxgo库内容请搜索风君子博客以前的文章或继续浏览下面的相关文章希望大家以后多多支持风君子博客! 您可能感兴趣的文章: Go语言操作mysql数据库简单例子 Golang的os标准库中常用函数的整理介绍 深入解析Go语言的io.ioutil标准库使用 Go编写定时器与定时任务详解(附第三方库gocron用法) 解决Go语言数据库中null值的问题
  • 目录
    • 关键总结
    • 示例代码

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

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

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

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

    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)
    }})
    

    到此这篇关于Golang rxgo库的具体使用的文章就介绍到这了,更多相关Golang rxgo库内容请搜索风君子博客以前的文章或继续浏览下面的相关文章希望大家以后多多支持风君子博客!

    您可能感兴趣的文章:

    • Go语言操作mysql数据库简单例子
    • Golang的os标准库中常用函数的整理介绍
    • 深入解析Go语言的io.ioutil标准库使用
    • Go编写定时器与定时任务详解(附第三方库gocron用法)
    • 解决Go语言数据库中null值的问题

    站内搜索