Go的标准软件包中的这三个功能有什么区别:
errors.Wrapf()
errors.Errorf()
,通过%w
格式变量fmt.Errorf()
,通过%w
格式变量什么时候应该使用一个代替其他?
最佳答案
首先,更正:
github.com/pkg/errors
不属于标准库!标准的 errors
软件包具有更小的API。
就是说,github.com/pkg/errors
非常流行,并且由一些著名的Gophers维护。但是,Go 1.13's extended error support很大程度上(尽管不是完全*)淘汰了它。
了解这三个功能之间的区别需要一些历史类(class)。
在Go 1.13之前,没有官方认可的“包装”错误的方法。 github.com/pkg/errors
用Wrap
和Wrapf
方法填补了这一空白。这样就可以使用其他上下文(包括堆栈跟踪)包装错误,同时以原始格式保留原始错误。
在开发Go 1.13时,github.com/pkg/errors
用于影响新的API,但最终版本略有不同。他们决定使用新的Wrap
动词扩展Wrapf
方法,而不是fmt.Errorf
和%w
方法,这将为您执行错误包装。
这意味着以下代码大致*等价:
import "github.com/pkg/errors"
/* snip */
return errors.Wrapf(err, "bad things")
// +build go1.13
import "fmt"
/* snip */
return fmt.Errorf("bad things: %w", err)
当Go 1.13发布时,
%w
动词被添加到fmt.Errorf
,github.com/pkg/errors
随之效仿并添加了相同的支持,因此Wrapf
实际上已经过时了。因此,这为我们带来了当今的建议:
github.com/pkg/errors.Errorf
来包装错误。 fmt.Errorf
。 errors.Wrapf
。这是为了向后兼容。 *标准库的
error
包仍然不包括堆栈跟踪,因此github.com/pkg/errors
仍然很受欢迎。关于go - errors.Wrapf(),errors.Errorf()和fmt.Errorf()之间有什么区别?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/61933650/