修改、改进 RxGo 包

本文档介绍了在服务计算Homework06中对RxGo的改进,包括新增Distinct、ElementAt、First、Last、Skip、SkipLast、Take和TakeLast等过滤操作。通过阅读ReactiveX文档并理解其原理,作者实现了这些操作,并提供了测试和API文档。测试结果显示过滤操作功能正常。
摘要由CSDN通过智能技术生成

服务计算Homework06

  • 项目地址
  • 使用说明
  • 下载项目后直接输入命令go run "hw06\main.go"即可运行hw06/main.go展示filter对应功能
  • hw06/rxgo-master中的filter.go为实现filter对应功能的源码
  • hw06/rxgo-master中的filter_test.go为filter对应功能的gotest测试
  • 测试命令为go test -v "hw06\rxgo-master\filter_test.go" "hw06\rxgo-master\filter.go" "hw06\rxgo-master\generators.go" "hw06\rxgo-master\transforms.go" "hw06\rxgo-master\utility.go" "hw06\rxgo-master\rxgo.go"
  • apidoc为对应自动生成的API,下载好相关资源(apidoc文件夹中的所有文件)后打开apidoc/index.html即可看到生成的API
课程任务
  • 阅读 ReactiveX 文档。请在pmlpml/RxGo基础上,
    • 修改、改进它的实现
    • 或添加一组新的操作,如filtering
  • 该库的基本组成:
    • rxgo.go 给出了基础类型、抽象定义、框架实现、Debug工具等
    • generators.go 给出了 sourceOperater 的通用实现和具体函数实现
    • transforms.go 给出了 transOperater 的通用实现和具体函数实现
RxGo的简单使用

pmlpml/RxGo下载对应包并导入本地goworks路径

  1. 调用generators.go中定义的Just方法:使用,分行打印helloworld!
package main

import (
	"fmt"
	RxGo "hw06/rxgo-master"
)

func main() {
   
	RxGo.Just("Hello", "World", "!").Subscribe(func(x string) {
   
		fmt.Println(x)
	})
}

// output:
// Hello
// World
// !
  1. 函数链调用:调用generators.go中的start方法,通过source.operator1().operator2().operator3().subscribe(observer)方式进行链调用
    • 调用fibonacci(10)实现求出10以内的斐波那契数列
    • 调用map将结果×2
    • 调用Subscribe输出
package main

import (
	"fmt"
	RxGo "hw06/rxgo-master"
)

func fibonacci(max int) func() (int, bool) {
   
	a, b := 0, 1
	return func() (r int, end bool) {
   
		r = a
		a, b = b, a + b
		if r > max {
   
			end = true
		}
		return
	}
}

func main() {
   
	RxGo.Start(fibonacci(10)).Map(func(x int) int {
   
		return 2 * x
	}).Subscribe(func(x int) {
   
		fmt.Print(x)
	})
}

// output
// 022461016
  1. 连接的observables,与管道类似,不同的是,它在订阅时不会开始发送项目,而只有在调用其connect()方法时才会开始发送
package main

import (
	"fmt"
	RxGo "hw06/rxgo-master"
)

func main() {
   
    //define pipeline
	source := RxGo.Just
RxGo 是 Go 语言的 Reactive 扩展。安装go get -u github.com/jochasinga/rxgo用法watcher := observer.Observer{     // Register a handler function for every next available item.     NextHandler: func(item interface{}) {         fmt.Printf("Processing: %v\n", item)     },     // Register a handler for any emitted error.     ErrHandler: func(err error) {         fmt.Printf("Encountered error: %v\n", err)     },     // Register a handler when a stream is completed.     DoneHandler: func() {         fmt.Println("Done!")     }, } it, _ := iterable.New([]interface{}{1, 2, 3, 4, errors.New("bang"), 5}) source := observable.From(it) sub := source.Subscribe(watcher) // wait for the async operation <-sub以上将:将切片中每个数字的格式字符串 print 为4。print 错误“bang”重要的是要记住,只有一个 OnError 或 OnDone 可以在 stream 中调用。 如果 stream 中有错误,处理停止,OnDone 将永远不会被调用,反之亦然。概念是将所有“side effects”分组到这些处理程序中,让一个 Observer 或任何 EventHandler 处理它们。package main import (     "fmt"     "time"     "github.com/jochasinga/rx"     "github.com/jochasinga/rx/handlers" ) func main() {     score := 9     onNext := handlers.NextFunc(func(item interface{}) {         if num, ok := item.(int); ok {             score  = num         }     })     onDone := handlers.DoneFunc(func() {         score *= 2     })     watcher := observer.New(onNext, onDone)     // Create an `Observable` from a single item and subscribe to the observer.     sub := observable.Just(1).Subscribe(watcher)     <-sub     fmt.Println(score) // 20 } 标签:RxGo
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值