Go语言中如何避免连续错误处理的代码重复?
最佳实践:提取重复错误逻辑为辅助函数
嘿,这个场景太常见了!你现在的重复错误处理代码完全可以通过抽离成辅助函数来解决,而且完全不会增加复杂度,反而让代码更清晰易维护。
具体怎么做?
首先,把那段重复的错误处理逻辑单独拎出来,做成一个小函数——它的职责很单一:接收错误和WebSocket连接,构造响应并异步发送。
方案1:包级辅助函数(如果WebSocket类型在包内可见)
// 定义在当前包的合适位置 func sendErrorResponse(ws WebSocketConn, err error) { pr := progressRes{ Type: progressResponse, Message: err.Error(), MessageType: errorMessage, Progress: 100, } go response(ws, pr.json()) }
然后你的业务代码就可以简化成这样:
nodes, err := model.AllNodes() if err != nil { sendErrorResponse(ws, err) return } links, err := model.AllLinks() if err != nil { sendErrorResponse(ws, err) return }
方案2:内部辅助函数(Go 1.21+推荐,更紧凑)
如果这段错误处理只在当前函数里用到,你可以直接在函数内部定义一个小函数,它能捕获外部的ws变量,不需要额外传参:
func yourBusinessFunction(ws WebSocketConn) { // 内部定义错误处理函数,直接捕获外层的ws sendError := func(err error) { pr := progressRes{ Type: progressResponse, Message: err.Error(), MessageType: errorMessage, Progress: 100, } go response(ws, pr.json()) } nodes, err := model.AllNodes() if err != nil { sendError(err) return } links, err := model.AllLinks() if err != nil { sendError(err) return } // 后续业务逻辑... }
为什么这是最佳实践?
- 完全符合DRY原则:彻底消除重复代码,以后要修改错误响应的格式(比如调整
Progress值或者MessageType),只需要改这一个函数就行,不用到处找重复代码修改。 - 零额外复杂度:函数职责单一,就是处理错误并发送响应,读代码的人一眼就能懂。
- 扩展性强:如果以后需要给错误响应加更多字段(比如错误码),只需要在辅助函数里调整,所有调用处自动生效。
内容的提问来源于stack exchange,提问作者Megidd




