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(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。