golang等待触发事件的实例
我就废话不多说了,大家还是直接看代码吧~
typeWaitinterface{ //RegisterwaitsreturnsachanthatwaitsonthegivenID. //ThechanwillbetriggeredwhenTriggeriscalledwith //thesameID. Register(iduint64)<-chaninterface{} //TriggertriggersthewaitingchanswiththegivenID. Trigger(iduint64,xinterface{}) IsRegistered(iduint64)bool } typeliststruct{ lsync.RWMutex mmap[uint64]chaninterface{} } funcNewlist()Wait{ return&list{m:make(map[uint64]chaninterface{})} } //注册 func(w*list)Register(iduint64)<-chaninterface{}{ w.l.Lock() deferw.l.Unlock() ch:=w.m[id] ifch!=nil{ log.Fatal("dupiderror") returnnil } ch=make(chaninterface{},1) w.m[id]=ch returnch } //触发 func(w*list)Trigger(iduint64,xinterface{}){ w.l.Lock() ch:=w.m[id] delete(w.m,id) w.l.Unlock() ifch!=nil{ ch<-x close(ch) } } //判断该id是否被注册 func(w*list)IsRegistered(iduint64)bool{ w.l.RLock() deferw.l.Unlock() _,ok:=w.m[id] returnok }
示例
vartimeOutDuration=time.Minute*10 funcmain(){ list:=Newlist() rid:=uint64(time.Now().UnixNano()) gofunc(){ ch:=list.Register(rid) fmt.Println("startregister:",rid) ifch==nil{ return } select{ casex:=<-ch: fmt.Printf("triggeroverid:%d,x:%v\n",rid,x) case<-time.After(timeOutDuration): log.Println("timeouterror:",rid) } }() time.Sleep(time.Second) rid2:=uint64(time.Now().UnixNano()) gofunc(){ ch:=list.Register(rid2) fmt.Println("startregister:",rid2) ifch==nil{ return } select{ casex:=<-ch: fmt.Printf("triggeroverid:%d,x:%v\n",rid2,x) case<-time.After(timeOutDuration): log.Println("timeouterror:",rid2) } }() gofunc(){ time.Sleep(time.Second*5) list.Trigger(rid,"Hello") time.Sleep(time.Second*3) list.Trigger(rid2,"World") }() select{ } }
补充:GO程序等待一段时间执行
我就废话不多说了,大家还是直接看代码吧~
packagemain import( "fmt" "time" ) funcmain(){ fmt.Println(time.Now()) //等1秒 time.Sleep(time.Second*1) fmt.Println(time.Now()) //等1秒 <-time.After(time.Second*1) fmt.Println(time.Now()) }
以上为个人经验,希望能给大家一个参考,也希望大家多多支持毛票票。如有错误或未考虑完全的地方,望不吝赐教。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。