佳木斯湛栽影视文化发展公司

主頁 > 知識庫 > golang等待觸發(fā)事件的實(shí)例

golang等待觸發(fā)事件的實(shí)例

熱門標(biāo)簽:AI電銷 網(wǎng)站排名優(yōu)化 Linux服務(wù)器 呼叫中心市場需求 地方門戶網(wǎng)站 百度競價排名 鐵路電話系統(tǒng) 服務(wù)外包

我就廢話不多說了,大家還是直接看代碼吧~

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
}
 
//觸發(fā)
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 {
 
	}
}
 

補(bǔ)充:GO 程序等待一段時間執(zhí)行

我就廢話不多說了,大家還是直接看代碼吧~

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

以上為個人經(jīng)驗(yàn),希望能給大家一個參考,也希望大家多多支持腳本之家。如有錯誤或未考慮完全的地方,望不吝賜教。

您可能感興趣的文章:
  • Golang中runtime的使用詳解
  • 如何判斷Golang接口是否實(shí)現(xiàn)的操作
  • 淺談golang中的&^位清空操作
  • Golang之defer 延遲調(diào)用操作
  • 解決golang sync.Wait()不執(zhí)行的問題
  • golang執(zhí)行命令操作 exec.Command
  • 對Golang中的runtime.Caller使用說明

標(biāo)簽:湘潭 仙桃 黃山 銅川 崇左 衡水 湖南 蘭州

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《golang等待觸發(fā)事件的實(shí)例》,本文關(guān)鍵詞  ;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 收縮
    • 微信客服
    • 微信二維碼
    • 電話咨詢

    • 400-1100-266
    延寿县| 邓州市| 呼伦贝尔市| 浦北县| 台北市| 个旧市| 九龙县| 枣庄市| 五常市| 治多县| 诸暨市| 隆德县| 南陵县| 山阳县| 光泽县| 施甸县| 棋牌| 长白| 巴里| 博野县| 诏安县| 昭觉县| 巴中市| 阳原县| 葫芦岛市| 二连浩特市| 珲春市| 唐海县| 玉屏| 石城县| 大同县| 正宁县| 鄄城县| 大石桥市| 德钦县| 乌拉特中旗| 剑川县| 大城县| 黄山市| 大方县| 贵德县|