新闻中心

Golang如何使用观察者模式监听事件_Golang Observer模式事件处理方法

2025-11-27
浏览次数:
返回列表
答案:Go通过接口和组合实现观察者模式,定义Event、Observer和Subject接口,用EventBus管理观察者注册与通知,结合具体观察者如Logger和EmailNotifier处理事件,支持动态注册注销,适用于解耦事件发布与处理,建议异步通知避免阻塞。

golang如何使用观察者模式监听事件_golang observer模式事件处理方法

在Go语言中实现观察者模式来监听和处理事件,是一种常见且有效的方式,尤其适用于解耦事件发布者与多个事件处理器之间的依赖。虽然Go没有类和继承机制,但通过接口和组合,能简洁地实现Observer(观察者)模式。

定义事件和观察者接口

观察者模式的核心是“主题”(Subject)维护一个观察者列表,当状态变化时通知所有观察者。先定义基本接口:

type Event struct {
    Type string
    Data interface{}
}
<p>type Observer interface {
OnEvent(event Event)
}</p><p>type Subject interface {
Register(observer Observer)
Unregister(observer Observer)
Notify(event Event)
}

Event 是传递的数据结构,Observer 定义响应事件的方法,Subject 提供注册、注销和广播的接口。

实现事件发布器(主题)

创建一个具体的主题实现,比如 EventBus:

type EventBus struct {
    observers []Observer
}
<p>func (bus *EventBus) Register(observer Observer) {
bus.observers = append(bus.observers, observer)
}</p><p>func (bus *EventBus) Unregister(observer Observer) {
for i, obs := range bus.observers {
if obs == observer {
bus.observers = append(bus.observers[:i], bus.observers[i+1:]...)
break
}
}
}</p><p>func (bus *EventBus) Notify(event Event) {
for _, observer := range bus.observers {
observer.OnEvent(event)
}
}

这个 EventBus 可以动态添加或移除观察者,并在事件发生时逐一通知。

编写具体观察者

观察者可以是任意实现了 OnEvent 方法的类型。例如,日志记录和邮件通知两个处理器:

Motiff妙多 Motiff妙多

Motiff妙多是一款AI驱动的界面设计工具,定位为“AI时代设计工具”

Motiff妙多 334 查看详情 Motiff妙多
type Logger struct{}
<p>func (l *Logger) OnEvent(event Event) {
fmt.Printf("LOG: %s - %v\n", event.Type, event.Data)
}</p><p>type EmailNotifier struct{}</p><p>func (e *EmailNotifier) OnEvent(event Event) {
if event.Type == "user.created" {
fmt.Printf("EMAIL SENT to %v\n", event.Data)
}
}

不同观察者可根据事件类型执行特定逻辑,实现关注点分离。

使用示例

将各组件组合起来:

func main() {
    bus := &EventBus{}
    logger := &Logger{}
    notifier := &EmailNotifier{}
<pre class="brush:php;toolbar:false;">bus.Register(logger)
bus.Register(notifier)

bus.Notify(Event{
    Type: "user.created",
    Data: "alice@example.com",
})

bus.Unregister(notifier)

bus.Notify(Event{
    Type: "config.updated",
    Data: "timeout=30s",
})

}

输出会显示:两条日志,一条邮件通知,第二条事件只被日志接收,说明注销生效。

基本上就这些。Go的接口和匿名组合让观察者模式实现非常轻量,适合用于配置变更通知、消息广播、插件系统等场景。关键是保持事件结构清晰,避免观察者阻塞主流程,必要时可用 goroutine 异步通知。

以上就是Golang如何使用观察者模式监听事件_Golang Observer模式事件处理方法的详细内容,更多请关注其它相关文章!


# golang  # go  # 网站建设要用到什么硬件  # 凡科的免费网站怎么推广  # 免费推广网站的方法  # 仙桃seo优化哪里做  # 网站推广seo关键词  # 成都企业网站建设与推广  # 菜馆推广营销文案范文怎么写  # 浦东seo哪家好  # 在哪可以推广网站  # 导航网站建设路  # 两条  # 正则表达式  # 中文网  # 相关文章  # 并在  # 多个  # 是一种  # 适用于  # 如何使用  # 数据结构  # ai  # app  # go语言  # 处理器 


相关栏目: 【 科技资讯46185 】 【 网络学院92790


相关推荐: c++如何使用TBB库进行任务并行_c++ Intel线程构建模块  动漫花园资源网使用步骤_动漫花园资源网下载流程  Golang如何实现简单的Web表单_Golang表单提交与验证处理方法  58动漫网在线官方网 58动漫网正版动漫入口网址  响应式图片在网页设计中的正确实现方法  Surface怎么安装系统 微软Surface Pro U盘重装win11教程  PyTorch模型训练效果不佳?深入剖析常见错误与调试技巧  steam官方入口大全 steam账号注册及操作指南  解决 MongoDB 聚合查询中对象数组 _id 匹配问题  MAC怎么让Dock栏只显示当前运行的应用_MAC终端命令实现极简Dock栏  Mac怎么锁定备忘录_Mac备忘录加密设置教程  QQ邮箱网页版快速登录 QQ邮箱邮箱账号官方入口地址  小红书怎么解除第三方平台绑定_小红书多平台登录解绑方法介绍  Win11怎么设置鼠标主按键_Win11鼠标左右键功能互换  必由学登录入口 必由学官方网站在线访问链接  Composer的 "check-platform-reqs" 命令有什么用_在部署前检查生产环境是否满足Composer依赖需求  C#中解析不规范的HTML为XML 常见的坑与解决办法  一加Ace 6T支持全新明眸护眼:通过了最严苛的护眼小金标认证  C++的std::mdspan是什么_C++23中用于操作多维数组的非拥有视图  GemBox Document HTML转PDF垂直文本渲染问题及解决方案  Windows10怎么开启夜间模式 Windows10系统设置调整色温与亮度缓解夜间用眼疲劳【教程】  高德地图沿途添加点失败如何解决 高德多点规划方法  VS Code远程开发时如何处理文件权限问题  163邮箱登录密码 163邮箱忘记密码找回  谷歌浏览器浏览体验优化_谷歌浏览器新版直连永久可用提示  腾讯视频怎么举报不良内容_腾讯视频内容举报流程与违规信息处理方法  qq邮箱日历功能怎么用_创建日程与会议邀请的技巧  AO3官方可用镜像 Archive of Our Own网页版最新入口  手机屏幕碎了但能正常使用怎么办 手机外屏碎裂的修复建议  微信语音通话掉线如何解决 微信语音通话稳定优化方法  地铁跑酷免费秒玩入口链接 地铁跑酷小游戏免费秒玩网站  痛风发作了怎么办? 快速止痛和后期饮食调理  c++中为什么推荐使用using替代typedef_c++现代化类型别名  AO3中文官网链接_AO3网页版稳定镜像站  如何使用Rector自动化升级旧代码_通过Composer安装和配置Rector进行代码重构  晋江读书网页版在线登录 晋江读书电脑版官网  Adobe PDF表单中利用J*aScript解析与格式化日期组件的教程  PHP URL参数传递与500错误调试指南  漫蛙manwa2最新登录网址_漫蛙manwa2手机网页版入口  蛙漫官方正版入口 蛙漫网页在线全集免费观看  知音漫客官网漫画下载_知音漫客网页版阅读记录  小米汽车11月交付量突破40000台!雷军:将继续努力  支付宝碰一碰设备是REDMI手机吗 博主拆机辟谣:处理器、内存都不一样  腾讯QQ邮箱登录入口_QQ邮箱官方网站使用地址  漫蛙2漫画入口 漫蛙正版网页漫画直达网址  必由学官网快捷入口 必由学网页版在线学习平台  CSS条件样式无法按设备触发怎么排查_media条件语句正确设置解决触发问题  yy漫画网页版官方入口_yy漫画官网登录页面链接  Golang如何测试channel通信行为_Golang channel通信测试与分析方法  优化 Python 函数中的条件逻辑:解决 if-else 嵌套与参数选择问题 

搜索