据我所知,errors.Join()是对多错误收集类型(如hashicorp/MultiError)的开箱即用的替代,它收集并行发生的错误.此问题不涉及常规错误包装/展开.

当我替换生产代码时,一些测试在try 计算联接的错误时失败.错误的数量和类型对于管理业务 case 都很重要.这适用于hashicorp/MultiError,因为将生成一个特定的字符串,类似于3 errors occurred.

package main

import "errors"

func doSomething() error {
    var multierror error
    err1 := errors.New("Hello")
    multierror = errors.Join(err1, err1)
    err2 := errors.New("World")
    multierror = errors.Join(err2, err1)

    return multierror
}

// somewhere else
func test_doSomething(t *testing.T) {
   actual := doSomething()
   assert.Len(t, 2, len(actual)????) // help
}

一旦我使用了errors.Join()次,我如何计算错误的数量?

我找不到一种方法来判断连接的错误中的错误切片的性质,而且判断所述错误切片本身也是不可能的,因为它是私有的.

使用errors.Unwrap(err)可能是一种方法,尽管我得到的结果要么是错误,要么是nil(如果是最后一个错误).它并不能准确地解决除errors.As/.Is之外的计数错误.

推荐答案

符合以下条件的errors.Join()个文档:

Join返回的非零错误实现了Unwire()[]Error方法.

因此,errors.Join()返回的error将有一个Unwrap() []error方法.Type assert包含该方法的接口类型,您可以调用它,它将以切片形式返回联接的错误:

例如:

err1 := errors.New("err1")
err2 := errors.New("err2")
err := errors.Join(err1, err2)

if uw, ok := err.(interface{ Unwrap() []error }); ok {
    errs := uw.Unwrap()
    fmt.Println("Number of joined errors:", len(errs))
}

这将输出(在Go Playground上试用):

Number of joined errors: 2

Go相关问答推荐

如何创建两个连接的io.ReadWriteClosers以用于测试目的

如何在jsonrpc服务器的服务器端捕获错误?

在不耗尽资源的情况下处理S3文件下载

Websocket服务器实现与x/net库trowing 403

如何使用Gio设置标题栏图标

无法使用Segentio;S Kafka-Go连接到融合的Kafka

如何创建在responseWriter.Write 上返回错误的http.ResponseWriter 模拟实例?

优化方式中所有可能组合的字符串相似度

我的神经网络(从头开始)训练,让它离目标更远

如果值为 false,gRPC 不返回布尔值

如何在 Golang http.Request 对象中读取自定义 ajaxParams

如何编写一个以字符串或错误为参数的通用函数?

Gorm 在保存/创建时序列化 struct

Go GCP 同时模拟两个服务帐户

K8s 算子读取原始数据

如何在眼镜蛇(golang)中将标志作为参数传递?

具有多个嵌入式 struct 的 Go MarshalJSON 行为

如何允许可转换为指针的泛型类型参数化另一种可转换为指针的泛型类型?

Go generics:我会在哪里使用 any 而不是 interface{}?

在 Go 泛型中,如何对联合约束中的类型使用通用方法?