首页 体育 教育 财经 社会 娱乐 军事 国内 科技 互联网 房产 国际 女人 汽车 游戏

解读 Go 语言的 2019:如果惊喜不再 还有哪些值得关注?

2020-01-13

我让 DetailedError 类型具有 Error string 办法,是为了让它完成 error 接口。Go 程序员必定都知道这一点。可是,过错类型 WrappedError 不只有 Error string 办法,还有 Unwrap error 办法。后者是为了让 errors.Unwrap 函数能够支撑 WrappedError 类型的值。

errors.Unwrap 函数便是我在前面说到的那个规范的办法。它能够从一个过错值中取出另一个过错值。但条件是,前者有必要具有 Unwrap error 办法,而且该办法一定会回来该过错值包括的那个过错值。

根据上面的类型声明,下面的代码会打印出如咱们所愿的内容:

 仿制代码

err1_1 := errors.New
err1_2 := WrappedError{
msg: operation failed ,
inner: err1_1,
fmt.Printf: %v
 , err1_2)
fmt.Printf: %v

 , errors.Unwrap)

输出内容:

 仿制代码

Message: operation failed
Message: unsupported operation

我不知道你有没有发现,这使得咱们能够生成一条恣意长度的过错链。持有这条过错链的程序能够经过 errors.Unwrap 函数从近端的过错值开端顺次地获取到它包括的一切过错值,直到取出最远端的那个过错值停止。如此一来,咱们就能够一层一层地包装过错值以反映出过错发作时的上下文状况。另一方面,拿到这样的过错值的程序也就有时机知道引发过错的根本原因是什么了。

当然了,咱们让过错类型具有 Unwrap error 办法不只有这一点优点。这样做也会让 errors.Is 函数和 errors.As 函数开端支撑此类型。

errors.Is 函数的签名是 Is bool。它的功用是从 err 以及它直接或直接包括的过错值中寻觅等于 target 的值。它会沿着过错链由外及内地对每一个过错值进行判别。一旦找到了持平的过错值,它就会回来 true。假如在遍历完整条过错链之后仍未找到与 target 持平的过错值,那么它就会回来 false。

errors.As 函数的寻觅途径与 errors.Is 函数是相同的。只不过,它寻觅的是在类型上与方针共同的过错值。从该函数的签名 As bool 咱们就能够了解到,参数 target 虽然会代表某个值,可是这个值的类型才是判别的真实根据。 当咱们有如下的两个变量:

 仿制代码

err2_1 := DetailedError{
msg: unsupported operation ,
err2_2 := WrappedError{
msg: operation failed ,
inner: err2_1,

那么,调用表达式 errors.Is 和 errors.As 回来的值就必定都会是 true。留意,errors.As 函数的第二个参数值有必要是某个过错值的指针值,而不能是过错值自身。不然将会引发一个运行时惊惧。

可是,就算现已执行了这些改善,Go 1.13 中的 errors 代码包也仍然处于一个“改善中”的状况。这首要是为了做到按部就班和确保向后兼容。充沛执行了新过错处理机制的代码实际上在 golang.org/x/xerrors 包中。这个代码包在 GitHub 上也有保管,地址是 https://github.com/golang/xerrors 。

使用这个代码包,咱们能够很方便地让现有的打印函数逐层地打印出一条过错链中的一切过错信息。不过,这就需求咱们为过错类型增加更多的办法了。代码如下:

 仿制代码

// FormattedError 是可露出内部过错信息的过错类型。
typeFormattedErrorstruct{
msgstring
inner error

热门文章

随机推荐

推荐文章