重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
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 }
看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注创新互联行业资讯频道,感谢您对创新互联的支持。