golang-event 在以太坊中的使用

当前位置:首页 > 币圈百科 > golang-event 在以太坊中的使用

golang-event 在以太坊中的使用

2022-12-04币圈百科245

去以太坊中围棋比赛库的使用

github。com/以太坊/去-以太坊/事件包实现了一个事件发布订阅的库,使用接口主要是事件。饲料类型,以前还有事件TypeMux类型,看代码注释,说过时了,目前主要使用饲料类型。包主导入(' fmt ' ' sync ' ' github。' func main(){ type some event struct { I int } var feed event .进给变量水表(Water Gauge的缩写)同步等待组ch:=make(更改某个事件)sub:=feed .订阅工作组添加(1) go func() { defer wg .事件的done():=范围ch { fmt .Printf('已接收:%#v ',事件I) } sub .退订()fmt .Println('done') }()提要。发送(某个事件{5})源。发送(某个事件{10})源。发送(某个事件{7})源。发送(某事蓑衣网小编2022件{14})关闭(ch)工作组Wait() }

通过调用事件。饲料类型的子分数方法订阅事件通知,需要使用者提前指定接收事件的频道,订阅返回签署对象,是一个接口类型:

类型订阅接口{ Err() //返回错误通道Unsubscribe() //取消发送事件,关闭错误通道}

Err()返回获取错误的渠道,调用取消订阅()取消事件订阅。事件的发布者调用发送()方法,发送事件

可以使用同一个频道实例,多次调用饲料的Subscrible()方法:

包主导入(' fmt ' ' sync ' ' github。' func main(){ var(feed event .进料接收同步。等待组发送者同步wait group)ch:=make(Chang int)feed .订阅(频道)源。订阅(频道)源subscribe(ch)expect sends:=func(value,n int) {延迟发送方. Done() if nsent :=feed .发送(值);nsent!=n { fmt .Printf('send delivered %d times,want %d ',nsent,n) } } expectRecv :=func(wantValue,n int) { defer recv .对v :=range ch { if v!=wantValue { fmt .Printf('received %d,want %d ',v,wantValue) } else { fmt .Printf('recv v=%d ',v) } } }发件人。对于i :=0,添加(3);i3;i { go expectSends(1,3) } go func() { sender .Wait() close(ch) }() recv .添加(1) go expectRecv(1,3) recv .Wait() }

golang-event 在以太坊中的使用

这个例子中,有三蓑衣网小编2022个订阅者,有三个发送者,每个发送者发送三次1, 同一个频道荣誉勋爵里面被推送了9个1。

以太坊事件库还提供了一些高级别的方便接口,比如事件。新订阅函数,接收一个函数类型,作为数据的生产者,制作人本身在后台一个单独的戈罗廷内执行,后台戈罗廷往用户的频道发送数据:

包主导入(' fmt ' ' github。' func main(){ ch:=make(chan int)sub:=event .新订阅(func(为I:=0退出;I 10i { select { case ch case-quit:fmt .println(' unsubscribed ')return nil } } return nil })for I:=range ch { fmt .如果i==4,则打印ln(i).Unsubscribe() break } } }

库也提供了事件。订阅范围类型用于追踪多个订阅者,提供集中的取消订阅功能:

包主导入(' fmt ' ' sync ' ' github)。com/ether eum/go-ether eum/event ')//此示例演示如何使用订阅范围来控制//订阅的生存期。//我们的示例程序包含两个服务器,每个服务器在//被请求时执行一次计算。服务器还允许订阅所有计算的结果类型div服务器结构{结果事件.Feed }类型mulServer结构{结果事件Feed } func (s *divServer) do(a,b int)int { r:=a/b s . results。send(r)return r } func(s * mul server)do(a,b int)int { r:=a * b s . results。发送(r)返回r }//服务器包含在一个应用中。该应用程序控制服务器,并通过其API//公开它们。类型应用程序结构{ divServer mulServer范围事件订阅范围} func(s 蓑衣网小编2022 * App)Calc(op byte,a,b int)int { switch op { case '/':返回s . div服务器。do(a,b)case ' *:返回s . mulserver。do(a,b)default:panic('无效op ')} }//App的订阅结果方法开始向给定的//通道发送计算结果。通过此方法创建的订阅与应用程序//的生存期相关联,因为它们是在范围中注册的func(s * App)subscribe results(op byte,ch chan switch op { case '/':返回s . scope。跟踪(s . div服务器。结果。subscribe(ch))case ' *:返回s . scope。跟踪(s . mulserver。结果。订阅(ch))默认值:panic('无效op') } } //Stop停止应用程序,关闭通过订阅结果创建的所有订阅func(s * App)Stop(){ s . scope。close()} func main(){ var(App App WG sync .wait group divs=make(chan int)muls=make(chan int))div sub:=app .SubscribeResults('/',divs) mulsub :=app .SubscribeResults('* ',muls)工作组Add(1) go func() { defer wg .完成()延迟fmt .{ select {病例结果:=-divs:fmt }的Println(“订户已退出”).println('发生除法:',结果)事例结果:=-muls: fmt .Println('乘法已发生:',result) case divErr :=-divsub .Err(): fmt .Println('divsub .Err():',divErr)返回case mulErr :=-mulsub .Err(): fmt .Println('mulsub .Err():',mulErr) return } } }() app .Calc('/',22,11)应用程序。计算(' * ',3,4)应用程序。停止()工作组wait()}

订阅范围的关闭()方法接收轨道方法的返回值,跟踪方法负责追踪订阅者十.
golang-event 在以太坊中的使用 | 分享给朋友: