Journal

博客

38 篇

技术笔记与思考碎片,可按分类与标签筛选浏览。

channel实现简易eventbus

本文介绍了一个适用于单机模块的 Go 语言事件总线(Eventbus)实现,用于异步事件的发布与订阅。通过 map[string]*EventChans 管理事件与多个通道的映射关系,并结合读写锁 sync.RWMutex 保证并发安全,实现了 Subscribe、UnSubscribe、Publish 三个核心方法,展示了如何安全高效地进行事件分发。适合 Go 初学者理解 channel 和并发控制。

技术channel11个月前

go中的panic和recover

Go 中的 `panic` 会导致当前 goroutine 崩溃,若未被 `recover` 捕获,则程序终止。`recover` 需配合 `defer` 使用,只能捕获**当前 goroutine** 内的 panic。若 panic 发生在子 goroutine 中,主 goroutine 的 `recover` 无法捕获,程序仍会崩溃,因此每个 goroutine 内需单独设置 `defer+recover` 才能防止异常扩散。

技术panic11个月前

channel的select case控制语句

`select case` 用于监听多个 channel 的就绪状态,只有当对应的读写操作**不阻塞**时才会执行。无缓冲通道需读写同时存在才就绪,有缓冲通道读需有值、写需未满。若多个 case 同时就绪,`select` 会**随机选择一个执行**,否则执行 `default`。配合 `time.After` 可实现超时控制,是并发中的常用模式。

技术channel11个月前

channel 基本概念

在 Go 语言中,channel 是一种用于**协程间通信**的数据结构。根据是否带缓冲区,channel 可分为**无缓冲区**和**有缓冲区**两类。 **无缓冲区的 channel** 是一种同步通信方式,发送和接收必须“当场配对”,发送方在没有接收方的情况下会被挂起,直到数据被接收。这就像一个共享的杯子,只有顾客喝掉牛奶,奶农才能继续挤下一杯。 **有缓冲区的 channel** 则支持异步通信,可以预先存入一定数量的值,只在缓冲区满时才会阻塞发送。它更像一个小型车间,奶农可以提前挤奶放进去,顾客随时取用。 理解这两者的差异对于编写高效的并发程序非常关键,尤其是在处理 goroutine 调度与通信时。

技术channel11个月前

缓冲区为 1 和无缓冲区的 channel 有什么区别

带缓冲区的 channel(如容量为 1)允许发送方先发送后接收,不会立即阻塞;而无缓冲区的 channel 发送操作会阻塞当前 goroutine,直到有接收方同步接收,否则会造成死锁。因此缓冲区提供了发送和接收的解耦能力。

技术channel11个月前

channel之生产者消费者模型

生产者消费者模型通过引入缓冲区,实现了生产与消费的解耦。无缓冲区的 channel 要求生产者与消费者同步配合,否则会阻塞,适合处理必须顺序执行的场景;而有缓冲区的 channel 则允许生产者先发送多个数据,无需等待消费者处理完成,适用于并发处理、异步任务等高性能场景。缓冲区提升了系统的灵活性、并发性和容错性。

技术channel11个月前

使用minio的go sdk上传文件

MinIO 是一款开源的分布式对象存储服务,兼容 S3 协议,通过 Go SDK 可以轻松实现文件上传,只需初始化客户端并调用 FPutObject 方法即可完成文件存储,支持自定义 Content-Type 和私有化部署,是替代商业 OSS 的高性价比方案。

技术ioc11个月前

wire优雅的管理go项目

Wire 是 Google 开发的 Go 依赖注入工具,通过自动生成代码管理模块依赖关系,解决手动初始化导致的混乱问题。它使用 wire.Build 定义依赖链,支持接口绑定和构造器集合,执行 wire 命令即可生成初始化代码。虽然学习成本较高,但能显著提升大型项目的可维护性,特别适合与 Gin 等框架集成使用。需注意处理循环依赖和接口绑定,小项目可能增加复杂度。

技术wire11个月前