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
}
看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注亿速云行业资讯频道,感谢您对亿速云的支持。
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。
原文链接:https://my.oschina.net/yongqing/blog/5056077