golang事件

package utils

import (
	// "fmt"
	"log"
)

//事件基类
type Event struct {
	IDispatcher iEventDispatcher //事件响应
	EventType   string           //类型
	Object      interface{}      //数据
}

//调度类
type EventDispatcher struct {
	cells []*eventCell
}

//调试器里存放单元
type eventCell struct {
	eventType string
	listeners []*EventListener
}

//监听
type EventListener struct {
	Haldler EventHandler
}

// 监听器函数
type EventHandler func(event Event)

//事件调试接口
type iEventDispatcher interface {
	//注册事件
	AddEventListener(eventType string, listener *EventListener)
	//移除事件
	RemoveEventListener(eventType string, listener *EventListener) bool
	//是否包含事件
	HasEventListener(eventType string) bool
	//事件派发
	DispatchEvent(e string, o interface{}) bool
	//删除所有事件
	RemoveAllEvent()
}

//调试器
func NewEventDispatcher() *EventDispatcher {
	e := &EventDispatcher{}
	return e
}

//监听器
func NewEventListener(h EventHandler) *EventListener {
	l := &EventListener{h}
	return l
}

//创建事件
func NewEvent(eventType string, obj interface{}) Event {
	e := Event{EventType: eventType, Object: obj}
	return e
}

//克隆事件
func (e *Event) Clone() *Event {
	n := &Event{}
	n.EventType = e.EventType
	n.Object = e.Object
	return n
}

//显示
func (e *Event) ToString() string {
	return ("Event eventType:" + e.EventType)
}

//添加事件
func (e *EventDispatcher) AddEventListener(eventType string, listener *EventListener) {
	// event := Event{name,data}
	//重复添加,待定
	for _, ev := range e.cells {
		if ev.eventType == eventType {
			ev.listeners = append(ev.listeners, listener)
			return
		}
	}
	//空的集合,要添加
	cell := &eventCell{eventType: eventType, listeners: []*EventListener{listener}}
	e.cells = append(e.cells, cell)
}

//取消
func (e *EventDispatcher) RemoveEventListener(eventType string, listener *EventListener) bool {
	// event := Event{name,data}
	//重复添加,待定
	for _, ev := range e.cells {
		if ev.eventType == eventType {
			for i, subListener := range ev.listeners {
				if subListener == listener {
					//找到了
					ev.listeners = append(ev.listeners[:i], ev.listeners[i+1:]...)
					return true
				}
			}
		}
	}
	return false
}

//是否包含某个事件
func (e *EventDispatcher) HasEventListener(eventType string) bool {
	for _, cell := range e.cells {
		if cell.eventType == eventType {
			return true
		}
	}
	return false
}

//事件分发
func (e *EventDispatcher) DispatchEvent(eventType string, o interface{}) bool {
	event := Event{EventType: eventType, Object: o}
	for _, cell := range e.cells {
		if cell.eventType == event.EventType {
			for _, listener := range cell.listeners {
				event.IDispatcher = e
				listener.Haldler(event)
			}
			return true
		}
	}
	log.Println("DispatchEvent error event:", event.EventType)
	return false
}

//删除所有事件
func (e *EventDispatcher) RemoveAllEvent() {
	e.cells = e.cells[0:0]
}
package utils

import (
	"log"
	"testing"
)

const event_test = "test"

//测试用例
func TestEvent(t *testing.T) {
	dispatcher := NewEventDispatcher()

	listener1 := NewEventListener(firstEventListener)
	listener2 := NewEventListener(secondEventListener)

	dispatcher.AddEventListener(event_test, listener1)
	dispatcher.DispatchEvent(event_test, "hello1")
	//第二个注册
	dispatcher.AddEventListener(event_test, listener2)
	dispatcher.AddEventListener(event_test, listener2)
	dispatcher.DispatchEvent(event_test, "hello2")
	//删除第一个
	dispatcher.RemoveEventListener(event_test, listener1)
	dispatcher.DispatchEvent(event_test, "hello3")
	//删除所有
	dispatcher.RemoveAllEvent()
	dispatcher.DispatchEvent(event_test, "hello4")
}

//第一个监听
func firstEventListener(event Event) {
	log.Println(event.EventType, event.Object, "第一个事件接收函数")
}

//第二个监听
func secondEventListener(event Event) {
	log.Println(event.EventType, event.Object, "第二个事件接收函数")
}

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Golang中的SSE(Server-Sent Events)是一种服务器向客户端单向发送事件流的技术。它允许服务器实时地向客户端发送数据,而无需客户端发起请求。这对于实现实时通信或推送消息非常有用。在Golang中,您可以使用`net/http`包来实现SSE。 下面是一个简单的示例代码,演示如何在Golang中使用SSE: ```go package main import ( "fmt" "net/http" "time" ) func main() { http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { // 设置响应头,指定使用SSE w.Header().Set("Content-Type", "text/event-stream") w.Header().Set("Cache-Control", "no-cache") w.Header().Set("Connection", "keep-alive") w.Header().Set("Access-Control-Allow-Origin", "*") // 循环发送事件数据 for i := 0; i < 10; i++ { // 通过写入响应流发送事件数据 fmt.Fprintf(w, "event: message\n") fmt.Fprintf(w, "data: This is message %d\n\n", i) // 刷新响应流,确保数据发送到客户端 w.(http.Flusher).Flush() time.Sleep(1 * time.Second) } }) http.ListenAndServe(":8080", nil) } ``` 在上述示例中,我们创建了一个HTTP服务器,并定义了一个处理函数来处理所有请求。在处理函数中,我们首先设置响应头,指定使用SSE。然后,我们进入一个循环,每隔1秒发送一个事件数据到客户端。使用`fmt.Fprintf`函数将事件数据写入响应流,通过`w.(http.Flusher).Flush()`来刷新响应,确保数据即时发送到客户端。 您可以运行上述代码,然后在浏览器中访问`http://localhost:8080`,您将看到10个事件从服务器实时地推送到客户端。 这只是一个简单的示例,您可以根据自己的需求进行扩展和定制。希望对您有所帮助!如果有任何进一步的问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

偶是江湖中人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值