我就废话不多说了,大家还是直接看代码吧~
type Wait interface { // Register waits returns a chan that waits on the given ID. // The chan will be triggered when Trigger is called with // the same ID. Register(id uint64) <-chan interface{} // Trigger triggers the waiting chans with the given ID. Trigger(id uint64, x interface{}) IsRegistered(id uint64) bool} type list struct { l sync.RWMutex m map[uint64]chan interface{}} func Newlist() Wait { return &list{m : make(map[uint64]chan interface{})}} //注册func (w *list) Register(id uint64) <-chan interface{} { w.l.Lock() defer w.l.Unlock() ch := w.m[id] if ch != nil { log.Fatal('dup id error') return nil } ch = make(chan interface{},1) w.m[id] = ch return ch} //触发func (w *list) Trigger(id uint64, x interface{}) { w.l.Lock() ch := w.m[id] delete(w.m,id) w.l.Unlock() if ch != nil { ch <- x close(ch) }} //判断该id是否被注册func (w *list) IsRegistered(id uint64) bool { w.l.RLock() defer w.l.Unlock() _,ok := w.m[id] return ok}
示例
var timeOutDuration = time.Minute*10 func main() {list := Newlist()rid := uint64(time.Now().UnixNano())go func() {ch := list.Register(rid)fmt.Println('start register:',rid)if ch == nil {return}select {case x := <- ch:fmt.Printf('trigger over id:%d,x:%vn',rid,x)case <-time.After(timeOutDuration):log.Println('timeout error:',rid)}}()time.Sleep(time.Second) rid2 := uint64(time.Now().UnixNano())go func() {ch := list.Register(rid2)fmt.Println('start register:',rid2)if ch == nil {return}select {case x := <- ch:fmt.Printf('trigger over id:%d,x:%vn',rid2,x)case <-time.After(timeOutDuration):log.Println('timeout error:',rid2)}}() go func() {time.Sleep(time.Second*5)list.Trigger(rid,'Hello')time.Sleep(time.Second*3)list.Trigger(rid2,'World')}() select { }}
补充:GO 程序等待一段时间执行
我就废话不多说了,大家还是直接看代码吧~
package mainimport ( 'fmt' 'time')func main() { fmt.Println(time.Now()) //等1秒 time.Sleep(time.Second * 1) fmt.Println(time.Now()) //等1秒 <-time.After(time.Second * 1) fmt.Println(time.Now())}
以上为个人经验,希望能给大家一个参考,也希望大家多多支持乐呵呵网。如有错误或未考虑完全的地方,望不吝赐教。