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())
}

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。如有错误或未考虑完全的地方,望不吝赐教。

(0)

相关推荐

  • 浅谈golang类型断言,失败类型断言返回值问题

    失败的类型断言,返回的值为最近断言类型的零值 代码入下: func main() { var data interface{} = "ehoo" if res, ok := data.(int); ok { fmt.Printf("int res:%d\n", res) } else if res, ok := data.(bool); ok { fmt.Printf("bool res:%b\n", res) } else { fmt.Prin

  • golang移除数组中重复的元素操作

    我就废话不多说了,大家还是直接看代码吧~ 方法一: //这种发放适用于string,int,float等切片,会对切片中的元素进行排序 func SliceRemoveDuplicates(slice []string) []string { sort.Strings(slice) i:= 0 var j int for{ if i >= len(slice)-1 { break } for j = i + 1; j < len(slice) && slice[i] == sl

  • 浅谈golang并发操作变量安全的问题

    我就废话不多说了,大家还是直接看代码吧~ package main import ( "fmt" "time" "sync" "sync/atomic" ) func main() { test1() test2() } func test1() { var wg sync.WaitGroup count := 0 t := time.Now() for i := 0 ; i < 50000 ; i++ { wg.Add

  • golang执行命令操作 exec.Command

    我就废话不多说了,大家还是直接看代码吧~ cmd := exec.Command("cmd") in := bytes.NewBuffer(nil) cmd.Stdin = in//绑定输入 var out bytes.Buffer cmd.Stdout = &out //绑定输出 go func() { in.WriteString("node E:/design/test.js\n")//写入你的命令,可以有多行,"\n"表示回车 }

  • golang使用aes库实现加解密操作

    golang实现加密解密的库很多,这里使用的是aes库+base64库来实现. 使用时,需要指定一个私钥,来进行加解密,这里指定是: var aeskey = []byte("321423u9y8d2fwfl") 上代码: package main import ( "fmt" "crypto/cipher" "crypto/aes" "bytes" "encoding/base64"

  • 快速解决Golang Map 并发读写安全的问题

    一.错误案例 package main import ( "fmt" "time" ) var TestMap map[string]string func init() { TestMap = make(map[string]string, 1) } func main() { for i := 0; i < 1000; i++ { go Write("aaa") go Read("aaa") go Write(&qu

  • 解决Golang map range遍历结果不稳定问题

    闲言少叙,本文主要是想介绍一个Golang开发常见的一个问题.然而,此问题对于初学者来说却经常容易陷入坑中. 问题 我在写一段代码时,使用了Golang的map数据结构,目的是想用map缓存计数结果.简单来说map的键也是整型的,且以递增顺序存储.我的最初想法是,在统计结束后,按照map中存储的键有序输出值.可是,当我运行程序时,结果并不是我想要的,而且有一定概率运行结果不同. 问题代码 func sortByBits(arr []int) []int { var bitmap = make(m

  • 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 c

  • JS代码触发事件代码实例

    这篇文章主要介绍了js代码触发事件代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 /*** * 需要触发谁的点击事件 * @param how_id 节点的id 如:<input id='test'/> 则how_id=test * @param how_this 这个要触发事件的节点 how_this = $("test"); * @returns */ function howChange(how_id,how

  • 基于jQuery的select下拉框选择触发事件实例分析

    本文实例讲述了基于jQuery的select下拉框选择触发事件实现方法.分享给大家供大家参考,具体如下: 我一直以来都认为,select 下拉框选择对选项 options 使用 onclick 注册事件即可,如下: <select> <option value="0" onclick="func(0)">选项一</option> <option value="1" onclick="func(1

  • Jquery on绑定的事件 触发多次实例代码

    用'on'函数为一个新增的按钮绑定了一个事件,这是事件会触发多次. <html> <head> <meta name="viewport" content="width=device-width" /> <title>码上飘</title> <script src="/FrontStyle/js/jquery-1.11.2.min.js" type="text/javas

  • js 动态生成html 触发事件传参字符转义的实例

    通常,在使用 JS 动态生成 html 的过程中,会嵌入相应的样式.事件等属性元素,而这时经常会出现所谓的 "单.双引号不够用" 的情况,别急,这时可以利用 html 语言中的转义字符来解决. 下面就来介绍一下相应的转义字符吧: & -- (ampersand) 转义字符对应为   & "   -- (double quote) 双引号,转义字符对应为  " '  -- (single quote)单引号,转义字符对应为  ' <  -- (l

  • 判断滚动条滑到底部触发事件(实例讲解)

    实例如下所示: $(document).on("scroll", function () { //真实内容的高度 var pageHeight = Math.max(document.body.scrollHeight, document.body.offsetHeight); //视窗的高度 var viewportHeight = window.innerHeight || document.documentElement.clientHeight || document.body

  • jquery实现回车键触发事件(实例讲解)

    键盘事件有3: keydown,keypress,keyup,分别是按下,按着没上抬,上抬键盘 . 正确代码为: $(document).keyup(function(event){ if(event.keyCode ==13){ $("#submit").trigger("click"); } }); 推荐:keyup,防止笔记本键盘不小心触摸到了 1.有些文档中有写成这样: $(window).keydown(function(){ ... }) XP系统IE6

  • vue父组件点击触发子组件事件的实例讲解

    最近在学习Vue父子组件通信的问题,刚好遇到一个父子之间事件事件派发与接收,在这里记录一下,在这里我使用的是ref 给子组件注册引用信息.官网是这样解释的 ref 被用来给元素或子组件注册引用信息.引用信息将会注册在父组件的 $refs 对象上.如果在普通的 DOM 元素上使用,引用指向的就是 DOM 元素; 如果用在子组件上,引用就指向组件实例: 父组件app.vue <template> <div id="app"> <!--父组件--> <

  • vue父组件触发事件改变子组件的值的方法实例详解

    父组件向子组件通信 业务场景:现在我要在父组件点击一个回退按钮,这个回退会传进子组件中(子组件中有两步进程),子组件来处理. 解决方案 起初我是父组件通过props传值,但是发现只有组件第一次加载时才能传值,通过事件改变的父组件值并不会再通过过props传递,也就是说props只有加载组件时才会工作,并不会根据值改变动态操作 后面,我是通过操作dom的方法,this.$refs.children这样直接操作子组件 <ProgressTwo ref="progressTwo" v-

  • jQuery中的on与bind绑定事件区别实例详解

    on(events,[selector],[data],fn) events:一个或多个用空格分隔的事件类型和可选的命名空间,如"click"或"keydown.myPlugin" . selector:一个选择器字符串用于过滤器的触发事件的选择器元素的后代. data:当一个事件被触发时要传递event.data给事件处理函数. fn:该事件被触发时执行的函数. false 值也可以做一个函数的简写,返回false. bind(type,[data],fn) 为每

随机推荐