go goroutine 怎样更好的进行错误处理
# 前言
在 Go 语言程序开发中,goroutine 的使用是比较频繁的,因此在日常编码的时候 goroutine 里的错误处理,怎么做会比较好呢?
一般我们的业务代码如下:
```go
func main() {
var wg sync.WaitGroup
wg.Add(2)
go func() {
//... 业务逻辑
wg.Done()
}()
go func() {
//... 业务逻辑
wg.Done()
}()
wg.Wait()
}
```
在上面的代码中,我们运行了多个 goroutine,每个协程又是单独行动的,想要抛出 error 错误信息,也不怎么明智。
# 通过错误日志记录
常用的第一种方法:通过把错误记录写入到日志文件中,再结合相关的 logtail 进行采集和梳理。
但这又会引入新的问题,那就是调用错误日志的方法写的到处都是,代码结构也比较乱、不直观。
最重要的是无法针对 error 做特定的逻辑处理和流转。
# 利用 channel 传输
大家可能会想到 Go 的经典哲学:**不要通过共享内存来通信,而是通过通信来实现内存共享**(Do not communicate by sharing memory; instead, share memory by communicating)。
第二种方法:利用 channel 来传输多个 goroutine 中的 errors:
```go
func main() {
cherrors := make(chan error)
wgDone := make(chan bool)
var wg sync.WaitGroup
wg.Add(2)
go func() {
//... 业务逻辑
wg.Done()
}()
go func() {
//... 业务逻辑
err := returnErr()
if err != nil {
cherrors go goroutine 怎样更好的进行错误处理