Golang Multi Errors

Golang 默认不支持 wrap 多个 err, 可以手动拼接字符串: fmt.Errorf("err1: %s, err2: %s", err1, err2). 但是这样会丢失原来 error 的信息, errors.Is()errors.As() 也失效了. 有一些第三方库实现了这个功能:

  1. GitHub - uber-go/multierr: Combine one or more Go errors together
  2. GitHub - hashicorp/go-multierror: A Go (golang) package for representing a li…

阅读了它们的源码后, 感觉 Uber 的实现更方便点, Hashicorp 的需要手动 Unwrap() 之后才能支持 errors.Is(), errors.As(), 并且, 他的这个实现也只对第一个错误进行了支持. 怪不得 otelcol 不使用 Hashicorp 的实现.

1.20 官方支持了 wrap 多个 error, 如果只是简单的 wrap errors 就可以不使用第三方包了, (第三方包里的一些工具函数还是挺方便的):

func Example() {
    err1 := errors.New("error1")
    err2 := errors.New("error2")
    err := fmt.Errorf("err1: %w, err2: %w", err1, err2)
    // Or
    err = errors.Join(err1, err2)
}

参考链接: