区块链技术博客
www.b2bchain.cn

go语言之修改、改进RxGo包

这篇文章主要介绍了go语言之修改、改进RxGo包的讲解,通过具体代码实例进行16208 讲解,并且分析了go语言之修改、改进RxGo包的详细步骤与相关技巧,需要的朋友可以参考下https://www.b2bchain.cn/?p=16208

本文实例讲述了2、树莓派设置连接WiFi,开启VNC等等的讲解。分享给大家供大家参考文章查询地址https://www.b2bchain.cn/7039.html。具体如下:

RxGo

  • 1、修改、改进RxGo包
    • 1.1 简介
    • 1.2 课程任务
  • 2、改进版RxGo
    • 2.1 设计说明
    • 2.2 程序主要函数
    • 2.3 单元测试
    • 2.4 功能测试

1、修改、改进RxGo包

1.1 简介

ReactiveX是Reactive Extensions的缩写,一般简写为Rx,最初是LINQ的一个扩展,由微软的架构师Erik
Meijer领导的团队开发,在2012年11月开源,Rx是一个编程模型,目标是提供一致的编程接口,帮助开发者更方便的处理异步数据流,Rx库支持.NET、JavaScript和C++,Rx近几年越来越流行了,现在已经支持几乎全部的流行编程语言了,Rx的大部分语言库由ReactiveX这个组织负责维护,比较流行的有RxJava/RxJS/Rx.NET,社区网站是reactivex.io。中文文档

为什么要重写

Go 语言的 RxGo 看上去就像 go 入门不久的人写的,很怪异。 但 RxJava 库写的很好。

pmlpml/RxGo 模仿 Java 版写了 Go 版本新实现,已基本实现了 Creating Observables 和 Transforming Observables 两类算子。

1.2 课程任务

阅读 ReactiveX 文档。请在 pmlpml/RxGo 基础上,

  1. 修改、改进它的实现
  2. 或添加一组新的操作,如 filtering

该库的基本组成:

rxgo.go 给出了基础类型、抽象定义、框架实现、Debug工具等

generators.go 给出了 sourceOperater 的通用实现和具体函数实现

transforms.go 给出了 transOperater 的通用实现和具体函数实现

2、改进版RxGo

2.1 设计说明

此改进版的RxGo包相对原版的pmlpml/RxGo增加了一组filter功能,还对rxgo.go进行了一定程度的修改,在Observable结构体中新增了一组filter的操作符。

	//filter model 	debounce   time.Duration 	distinct   bool 	elementAt  int 	first      bool 	ignoreElements bool 	last       bool 	sample     chan interface{} 	take       int 	skip       int 

而这些新增的操作符的具体功能则会在filter.go文件中实现。

2.2 程序主要函数

此改进版RxGo库包括rxgo.go, generators.go, transforms.go, filter.goutility.go五个文件以及相关的测试文件,而改进的内容主要放在了filter.go中,主要内容如下:

  • filterOperator结构体:此结构体用于过滤操作,封装了一个func函数作为接口使用;
  • op函数:实现了对各个filter操作的初始化以及其报错信息,根据不同的操作来获取数据流;
  • newFilterObservable函数:用于创建新的filter过滤操作函数,并初始化一些字段;
  • take函数:判断filter操作中要发射的是哪些数据,用于TakeTakeLast函数;
  • skip函数:判断filter操作中要跳过的是哪些数据,用于SkipSkipLast函数;
  • xxOperator函数:定义xxOperator结构体,封装实现该功能的opFunc,本应是具体过滤操作的具体实现,但因为这些过滤操作的实现已经在op函数中完成,所以此函数只需要发射数据流即可。
  • Xxxx函数:即filter操作的具体定义函数,这一类函数的作用是设置过滤操作的相关信息,如果有传入参数,则将传入的参数设置到具体所需的位置。
    • Debounce:仅在过了一段指定的时间还没发射数据时才发射一个数据
    • Distinct:抑制(过滤掉)重复的数据项
    • ElementAt:只发射第N项数据
    • First:只发射第一项(或者满足某个条件的第一项)数据
    • IgnoreElements:不发射任何数据
    • Last:只发射最后一项(或者满足某个条件的最后一项)数据
    • Sample:定期发射Observable最近发射的数据项
    • Skip:抑制(跳过)Observable发射的前N项数据
    • SkipLast:抑制(跳过)Observable发射的后N项数据
    • Take:只发射bservable发射的前面的N项数据
    • TakeLast:只发射Observable发射的最后N项数据

(注:具体的函数功能可以查看手册:中文手册、英文手册)

2.3 单元测试

此包对主要函数都涉及了相应的单元测试,此处主要讲我所涉及的filter_test.go中的测试函数。

一共有10个单元测试函数,分别对filter操作中的各个具体操作进行测,测试结果如下:

go语言之修改、改进RxGo包
其中比较特殊的是Debounce测试,这里我将debounce的时间设置得很长,最后得到的数组只有头一个元素。

func TestDebounce(t *testing.T) { 	var res []int 	rxgo.Just(0, 12, 7, 34, 2).Debounce(10000).Subscribe(func(x int) { 		res = append(res, x) 	})  	assert.Equal(t, []int{0}, res, "DebounceTest Error!") } 

其他的具体的测试函数内容可以查看filter_test.go文件,不贴太多代码。

2.4 功能测试

为了方便理解以及应用过滤操作,我还进行了功能测试,具体内容放在main.go文件中。
main.go:

package main  import ( 	"fmt" 	"gitee.com/li-haowei/rxgo" )  func main(){ 	var res  = []int{0, 10, 20, 30, 40, 10, 30} 	fmt.Printf("The test data is : %vn", res)  	//Debounce 	res = []int{} 	rxgo.Just(0, 10, 20, 30, 40, 10, 30).Debounce(10000).Subscribe(func(x int) { 		res = append(res, x) 	}) 	fmt.Printf("The result of Debounce is : %vn", res)  	//Distinct 	res = []int{} 	rxgo.Just(0, 10, 20, 30, 40, 10, 30).Distinct().Subscribe(func(x int) { 		res = append(res, x) 	}) 	fmt.Printf("The result of Distinct is : %vn", res)  	//ElementAt 	res = []int{} 	rxgo.Just(0, 10, 20, 30, 40, 10, 30).ElementAt(3).Subscribe(func(x int) { 		res = append(res, x) 	}) 	fmt.Printf("The result of ElementAt is : %vn", res)  	//First 	res = []int{} 	rxgo.Just(0, 10, 20, 30, 40, 10, 30).First().Subscribe(func(x int) { 		res = append(res, x) 	}) 	fmt.Printf("The result of First is : %vn", res)  	//IgnoreElements 	res = []int{} 	rxgo.Just(0, 10, 20, 30, 40, 10, 30).IgnoreElements().Subscribe(func(x int) { 		res = append(res, x) 	}) 	fmt.Printf("The result of IgnoreElements is : %vn", res)  	//Last 	res = []int{} 	rxgo.Just(0, 10, 20, 30, 40, 10, 30).Last().Subscribe(func(x int) { 		res = append(res, x) 	}) 	fmt.Printf("The result of Last is : %vn", res)  	//Skip 	res = []int{} 	rxgo.Just(0, 10, 20, 30, 40, 10, 30).Skip(3).Subscribe(func(x int) { 		res = append(res, x) 	}) 	fmt.Printf("The result of Skip is : %vn", res)  	//SkipLast 	res = []int{} 	rxgo.Just(0, 10, 20, 30, 40, 10, 30).SkipLast(4).Subscribe(func(x int) { 		res = append(res, x) 	}) 	fmt.Printf("The result of SkipLast is : %vn", res)  	//Take 	res = []int{} 	rxgo.Just(0, 10, 20, 30, 40, 10, 30).Take(2).Subscribe(func(x int) { 		res = append(res, x) 	}) 	fmt.Printf("The result of Take is : %vn", res)  	//TakeLast 	res = []int{} 	rxgo.Just(0, 10, 20, 30, 40, 10, 30).TakeLast(3).Subscribe(func(x int) { 		res = append(res, x) 	}) 	fmt.Printf("The result of TakeLast is : %vn", res) }  

在main.go文件所在目录下运行go run main.go,可以得到以数组{0, 10, 20, 30, 40, 10, 30}作为测试数据的各个过滤操作得到的结果。

go语言之修改、改进RxGo包

本文转自互联网,侵权联系删除go语言之修改、改进RxGo包

赞(0) 打赏
部分文章转自网络,侵权联系删除b2bchain区块链学习技术社区 » go语言之修改、改进RxGo包
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

b2b链

联系我们联系我们