温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

如何在golang项目中实现一个等待触发事件

发布时间:2020-12-23 14:24:43 来源:亿速云 阅读:422 作者:Leah 栏目:开发技术

今天就跟大家聊聊有关如何在golang项目中实现一个等待触发事件,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。

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:%v\n",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:%v\n",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 main import (  "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()) }

看完上述内容,你们对如何在golang项目中实现一个等待触发事件有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注亿速云行业资讯频道,感谢大家的支持。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI