好文推荐
关键总结
可以类比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)
}})