登录
首页 >  Golang >  Go问答

如何在 Go 1.20 中诊断连接错误?

来源:stackoverflow

时间:2024-02-18 19:42:22 498浏览 收藏

“纵有疾风来,人生不言弃”,这句话送给正在学习Golang的朋友们,也希望在阅读本文《如何在 Go 1.20 中诊断连接错误?》后,能够真的帮助到大家。我也会在后续的文章中,陆续更新Golang相关的技术文章,有好的建议欢迎大家在评论留言,非常感谢!

问题内容

据我了解, errors.Join() 是多错误集合类型的开箱即用替代品,例如 hashcorp/multierror ,它收集并行发生的错误。这个问题不解决常规错误包装/展开。

当我替换生产代码时,一些测试在尝试计算连接错误时失败。错误的数量和类型对于管理业务案例都很重要。这适用于 hashcorp/multierror,因为会生成某个字符串,例如 3 错误发生

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() 记录:

因此 errors.Join() 返回的 error 将有一个 Unwrap() []error 方法。 类型断言 持有该方法的接口类型,您可以调用它,它将返回连接的切片错误:

例如:

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 1.20 中诊断连接错误?》的详细内容,更多关于的资料请关注golang学习网公众号!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>