在Go語言中,事件處理通常是通過通道(channel)和goroutine來實現的。通道是Go語言中的一種內置數據結構,可以用于在不同的goroutine之間傳遞數據。goroutine是Go語言中的輕量級線程,可以并發執行。
下面是一個簡單的示例,展示了如何使用通道和goroutine實現事件處理:
package main
import (
"fmt"
"time"
)
// 定義一個事件類型
type Event struct {
ID int
Message string
}
// 定義一個事件處理器接口
type EventHandler interface {
HandleEvent(event Event)
}
// 定義一個具體的事件處理器
type MyEventHandler struct{}
func (h *MyEventHandler) HandleEvent(event Event) {
fmt.Printf("處理事件: ID=%d, Message=%s\n", event.ID, event.Message)
}
// 定義一個事件分發器
type EventDispatcher struct {
eventHandler EventHandler
eventChan chan Event
}
func NewEventDispatcher(eventHandler EventHandler) *EventDispatcher {
return &EventDispatcher{
eventHandler: eventHandler,
eventChan: make(chan Event),
}
}
func (d *EventDispatcher) Start() {
go func() {
for event := range d.eventChan {
d.eventHandler.HandleEvent(event)
}
}()
}
func (d *EventDispatcher) DispatchEvent(event Event) {
d.eventChan <- event
}
func main() {
// 創建一個事件處理器
eventHandler := &MyEventHandler{}
// 創建一個事件分發器
eventDispatcher := NewEventDispatcher(eventHandler)
// 啟動事件分發器
eventDispatcher.Start()
// 分發一些事件
for i := 0; i < 5; i++ {
event := Event{
ID: i,
Message: fmt.Sprintf("這是事件 %d", i),
}
eventDispatcher.DispatchEvent(event)
time.Sleep(1 * time.Second)
}
}
在這個示例中,我們定義了一個Event
類型來表示事件,一個EventHandler
接口來定義事件處理的方法,以及一個具體的MyEventHandler
結構體來實現事件處理。我們還定義了一個EventDispatcher
結構體來分發事件,它包含一個事件處理器和一個事件通道。
EventDispatcher
的Start
方法啟動一個新的goroutine來監聽事件通道,并在接收到事件時調用事件處理器的HandleEvent
方法。DispatchEvent
方法用于向事件通道發送事件。
在main
函數中,我們創建了一個事件處理器和一個事件分發器,然后啟動事件分發器并分發一些事件。每個事件處理完成后,程序會等待1秒鐘再發送下一個事件。