golang中怎么实现一个Event事件,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。
package common import ( "context" "errors" "go.uber.org/zap" "time" ) func NewEvent() *Event { e := &Event{ log: zap.S(), } e.Reset() return e } type Event struct{ //监听者 waiters []chan interface{} //结果 result interface{} //上下文控制 ctxBg context.Context ctxCancel context.CancelFunc //日志 log *zap.SugaredLogger } //等待结果 func (e *Event) Wait(timeout time.Duration) interface{}{ ctx, cancel := context.WithTimeout(e.ctxBg, time.Second*timeout) defer cancel() //等待者 resultChan := make(chan interface{}, 1) e.waiters = append(e.waiters, resultChan) //等待 select{ case result := <- resultChan: return result case <- ctx.Done(): } return nil } //发送结果 func (e *Event) Send(result interface{}) error{ //防止发送多次 if e.result !=nil{ return errors.New("Event is used") } e.result = result for _, resultChan := range e.waiters{ select{ case resultChan <- result: default: e.log.Warnf("Event.Send %p resultChan=%d, result=%v", e, len(resultChan), result) } } return nil } //重置 func (e *Event) Reset(){ if e.ctxBg !=nil{ e.ctxCancel() } e.ctxBg, e.ctxCancel = context.WithCancel(context.Background()) e.waiters = nil e.result = nil }
看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注亿速云行业资讯频道,感谢您对亿速云的支持。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。