当前位置:   article > 正文

golang struct 转 interface_Go语言(golang)新发布的1.13中的Error Wrapping深度分析

go struct强转interface

2019.09.03日,Golang 1.13版本发布,这次更新算是比较大的了,有大家期待的GOPROXY和GOPRIVATE等,具体的可以去看这个版本的 Go 1.13 Release Notes。

Go 1.13发布的功能还有一个值得深入研究的,就是对Error的增强,也是今天我们要分析的 Error Wrapping.

背景

Go语言开发的,肯定经常用error,但是我们也知道error非常弱,只能自带一串文本其他什么都做不了,比如给已经存在的error增加一些附加文本,增加堆栈信息等都做不了。如果我们想给error增加一些附加文本怎么做呢?有两种办法:

第一种:

newErr:=fmt.Errorf("数据上传问题: %v", err)

通过fmt.Errorf函数,基于已经存在的err再生成一个新的newErr,然后附加上我们想添加的文本信息。这种办法比较方便,但是问题也很明显,我们丢失了原来的err,因为它已经被我们的fmt.Errorf函数转成一个新的字符串了。

第二种:

  1. func main() {
  2.     newErr := MyError{err, "数据上传问题"}}type MyError struct {
  3.     err error    msg string}func (e *MyError) Error() string {
  4.     return e.err.Error() + e.msg}

这种方式就是我们自定义自己的struct,添加用于存储我们需要额外信息的字段,我这里是errmsg,分别存储原始err和新附加的出错信息。然后这个MyError还会实现error接口,表示他是一个error,这样我们就可以自由的使用了。

这种方式有点很明显,大家可以看到了。缺点呢,就是我们要自定义很多struct,而且我们自己定义的,和第三方的可能还不太一样,无法统一和兼容。基于这个背景,Golang 1.13 为我们提供了Error Wrapping,翻译过来我更愿意叫Error嵌套。

如何生成一个Wrapping Error

Error Wrapping,顾名思义,就是为我们提供了,可以一个error嵌套另一个error功能,好处就是我们可以根据嵌套的error序列,生成一个error错误跟踪链,也可以理解为错误堆栈信息,这样可以便于我们跟踪调试,哪些错误引起了什么问题,根本的问题原因在哪里。

因为error可以嵌套,所以每次嵌套的时候,我们都可以提供新的错误信息,并且保留原来的error。现在我们看下如何生成一个嵌套的error

e := errors.New("原始错误e")w := fmt.Errorf("Wrap了一个错误%w", e)
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/黑客灵魂/article/detail/907855
推荐阅读
相关标签
  

闽ICP备14008679号