#event - 事件系統
#概述
event 模組實現了發布/訂閱模式,用於事件驅動架構,支持同步和異步事件處理。
#類型
#EventHandler
事件處理函數。
type EventHandler func(args any)#Manager
事件管理器,用於處理事件。
type Manager struct {
eventMux sync.RWMutex
events map[string][]*eventItem
c chan *emitItem
}#函數
#Register()
註冊事件處理器。
func Register(eventName string, handler EventHandler)參數:
eventName- 事件名稱handler- 事件處理函數
示例:
event.Register("user.created", func(args any) {
user := args.(User)
log.Infof("User created: %s", user.Name)
})#RegisterAsync()
註冊異步事件處理器。
func RegisterAsync(eventName string, handler EventHandler)參數:
eventName- 事件名稱handler- 事件處理函數
示例:
event.RegisterAsync("user.created", func(args any) {
user := args.(User)
sendWelcomeEmail(user)
})#Emit()
發出事件並傳遞參數。
func Emit(eventName string, args any)參數:
eventName- 事件名稱args- 事件參數
示例:
user := User{Name: "John", Email: "john@example.com"}
event.Emit("user.created", user)#使用模式
#事件驅動架構
func setupEventHandlers() {
// 註冊處理器
event.Register("user.created", handleUserCreated)
event.Register("user.updated", handleUserUpdated)
event.Register("user.deleted", handleUserDeleted)
event.RegisterAsync("user.created", sendWelcomeEmail)
event.RegisterAsync("user.created", updateAnalytics)
}
func handleUserCreated(args any) {
user := args.(User)
log.Infof("User created: %s", user.Name)
// 更新數據庫
db.Create(&user)
}
func sendWelcomeEmail(args any) {
user := args.(User)
emailService.SendWelcome(user.Email)
}
func updateAnalytics(args any) {
user := args.(User)
analytics.TrackUserCreated(user.ID)
}#應用生命週期
func setupApplicationEvents() {
event.Register("app.start", handleAppStart)
event.Register("app.stop", handleAppStop)
event.Register("app.error", handleAppError)
}
func handleAppStart(args any) {
log.Info("Application started")
initializeServices()
}
func handleAppStop(args any) {
log.Info("Application stopping")
cleanupResources()
}
func handleAppError(args any) {
err := args.(error)
log.Errorf("Application error: %v", err)
alertService.SendAlert(err)
}#組件通信
func setupComponentEvents() {
event.Register("data.updated", handleDataUpdate)
event.Register("data.loaded", handleDataLoad)
}
func handleDataUpdate(args any) {
data := args.(Data)
log.Infof("Data updated: %s", data.ID)
// 刷新 UI
ui.Refresh()
}
func handleDataLoad(args any) {
data := args.(Data)
log.Infof("Data loaded: %s", data.ID)
// 更新緩存
cache.Set(data.ID, data)
}#最佳實踐
#事件命名
// 好的做法: 使用描述性的事件名稱
event.Register("user.created", handler)
event.Register("user.updated", handler)
event.Register("user.deleted", handler)
// 好的做法: 使用分層命名
event.Register("order.created", handler)
event.Register("order.paid", handler)
event.Register("order.shipped", handler)#錯誤處理
// 好的做法: 在事件處理器中處理錯誤
event.Register("user.created", func(args any) {
defer func() {
if r := recover(); r != nil {
log.Errorf("Panic in event handler: %v", r)
}
}()
user := args.(User)
if err := db.Create(&user); err != nil {
log.Errorf("Failed to create user: %v", err)
}
})