首先,更正一下:
github.com/pkg/errors
是标准库的not部分!标准errors
包的API要小得多.
这就是说,github.com/pkg/errors
非常受欢迎,并由一些著名的地鼠维护.然而,到了Go 1.13's extended error support年,它基本上(尽管不是完全)被淘汰了.
理解这三个函数之间的区别需要上一点历史课.
在Go 1.13之前,没有官方认可的"包装"错误的方法.github.com/pkg/errors
用Wrap
和Wrapf
方法填补了这一空白.这允许使用附加上下文(包括堆栈跟踪)包装错误,同时以原始形式保留原始错误.
在Go 1.13开发时,github.com/pkg/errors
被用来影响新的API,但最终版本略有不同.他们决定用一个新的%w
动词来扩展fmt.Errorf
方法,而不是Wrap
和Wrapf
方法,这将为您执行错误包装.
这意味着以下代码位大致*等价:
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问世时,fmt.Errorf
增加了%w
个动词,github.com/pkg/errors
也跟着增加了同样的支持,所以现在Wrapf
实际上已经过时了.
因此,这就把我们带到了今天的建议:
- 如果希望在错误中进行堆栈跟踪,请使用
github.com/pkg/errors.Errorf
来包装错误.
- 如果您不关心堆栈跟踪,可以使用标准库中的
fmt.Errorf
.
- 永远不要再用
errors.Wrapf
了.这是为了向后兼容.
*标准库的error
包仍未包含堆栈痕迹,因此github.com/pkg/errors
仍受欢迎