新闻中心
Golang如何使用观察者模式监听事件_Golang Observer模式事件处理方法
答案:Go通过接口和组合实现观察者模式,定义Event、Observer和Subject接口,用EventBus管理观察者注册与通知,结合具体观察者如Logger和EmailNotifier处理事件,支持动态注册注销,适用于解耦事件发布与处理,建议异步通知避免阻塞。

在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妙多
是一款AI驱动的界面设计工具,定位为“AI时代设计工具”
334
查看详情
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 嵌套与参数选择问题


2025-11-27
浏览次数:次
返回列表