Go中错误通知机制核心是用channel跨goroutine安全传递error值,关键在于“发送错误”而非“抛出错误”;应定义专用类型如type ErrorChan = chan error提升可读性与安全性。

在 Go 中实现错误通知机制,核心思路是利用 channel 作为错误传递的管道,让错误能跨 goroutine 安全、及时地被收集或响应。关键不是“抛出错误”,而是“发送错误”——把 error 类型值通过 channel 推送给监听者。
定义统一的错误通道类型
为避免类型混乱,建议用带类型的 channel 显式表达用途:
// 声明专用的错误通道类型,提升可读性和安全性
type ErrorChan = chan
// 或更明确地封装:
type ErrorHandler struct {
errors chan error
}
func NewErrorHandler(bufSize int) *ErrorHandler {
return &ErrorHandler{errors: make(chan error, bufSize)}
}
在异步操作中发送错误
当启动 goroutine 执行可能出错的任务(如 HTTP 请求、文件读取、数据库查询)时,在 defer 或 if err != nil 分支中向 channel 发送错误:
立即学习“go语言免费学习笔记(深入)”;
go func() {
defer func() {
if r := recover(); r != nil {
eh.errors }
}()
if err := doSomething(); err != nil {
eh.errors }
}()
集中监听并处理错误
主 goroutine 或专门的监控 goroutine 持续从 channel 接收错误,并执行日志记录、告警、重试或终止流程等动作:
go func() {
for err := range eh.errors {
log.Printf("Error occurred: %v", err)
// 可扩展:发 Slack、写监控指标、触发熔断等
}
}()
注意:channel 必须有接收方,否则发送会阻塞(除非使用带缓冲 channel)。推荐初始化时就启动监听 goroutine,或确保调用方已准备好接收。
配合 context 实现可取消的错误通知流
若需支持超时或主动停止监听,可将 channel 与 context 结合:
func (eh *ErrorHandler) Listen(ctx context.Context) {
for {
select {
case err, ok := if !ok { return }
log.Error(err)
case return
}
}
}
这样既保证了错误不丢失(在 channel 关闭前),又支持优雅退出。










