github.com/linapex/ethereum-go-chinese@v0.0.0-20190316121929-f8b7a73c3fa1/event/example_feed_test.go (about) 1 2 //<developer> 3 // <name>linapex 曹一峰</name> 4 // <email>linapex@163.com</email> 5 // <wx>superexc</wx> 6 // <qqgroup>128148617</qqgroup> 7 // <url>https://jsq.ink</url> 8 // <role>pku engineer</role> 9 // <date>2019-03-16 19:16:38</date> 10 //</624450090815197184> 11 12 13 package event_test 14 15 import ( 16 "fmt" 17 18 "github.com/ethereum/go-ethereum/event" 19 ) 20 21 func ExampleFeed_acknowledgedEvents() { 22 //此示例显示如何将send的返回值用于请求/答复 23 //活动消费者和生产者之间的互动。 24 var feed event.Feed 25 type ackedEvent struct { 26 i int 27 ack chan<- struct{} 28 } 29 30 //消费者等待feed上的事件并确认处理。 31 done := make(chan struct{}) 32 defer close(done) 33 for i := 0; i < 3; i++ { 34 ch := make(chan ackedEvent, 100) 35 sub := feed.Subscribe(ch) 36 go func() { 37 defer sub.Unsubscribe() 38 for { 39 select { 40 case ev := <-ch: 41 fmt.Println(ev.i) //“处理”事件 42 ev.ack <- struct{}{} 43 case <-done: 44 return 45 } 46 } 47 }() 48 } 49 50 //生产者发送AckedEvent类型的值,增加i的值。 51 //它在发送下一个事件之前等待所有消费者确认。 52 for i := 0; i < 3; i++ { 53 acksignal := make(chan struct{}) 54 n := feed.Send(ackedEvent{i, acksignal}) 55 for ack := 0; ack < n; ack++ { 56 <-acksignal 57 } 58 } 59 //输出: 60 //零 61 //零 62 //零 63 //一 64 //一 65 //一 66 //二 67 //二 68 //二 69 } 70